diff options
| author | TakaRikka <38417346+TakaRikka@users.noreply.github.com> | 2024-10-10 07:29:58 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-10 08:29:58 -0600 |
| commit | 12eb254d769d84743b5cc6cd5424057c57eaf0ad (patch) | |
| tree | 4509be332b2ccfc6fe939f47740d68f7746eca3e /src/d/d_event_data.cpp | |
| parent | 2fd702c0ac170a789af879b8b92a82d4dcc9080c (diff) | |
switch to dtk setup (#2203)
* switch to dtk setup
* some cleanup / fixes
* cleanup d_a_alink literals
* Restore doxygen, update CI & README.md (#1)
* Fix build image ref (#2)
---------
Co-authored-by: Luke Street <luke@street.dev>
Diffstat (limited to 'src/d/d_event_data.cpp')
| -rw-r--r-- | src/d/d_event_data.cpp | 1288 |
1 files changed, 1288 insertions, 0 deletions
diff --git a/src/d/d_event_data.cpp b/src/d/d_event_data.cpp new file mode 100644 index 0000000000..14459e90a3 --- /dev/null +++ b/src/d/d_event_data.cpp @@ -0,0 +1,1288 @@ +/** + * d_event_data.cpp + * Event Data Processor + */ + +#include "d/d_event_data.h" +#include "d/actor/d_a_player.h" +#include "d/d_demo.h" +#include "d/d_gameover.h" +#include "d/d_msg_object.h" +#include "m_Do/m_Do_graphic.h" + +inline BOOL dEvDtFlagCheck(int flag) { + return dComIfGp_getEventManager().flagCheck(flag); +} + +inline void dEvDtFlagSet(int flag) { + dComIfGp_getEventManager().setFlag(flag); +} + +struct TelopDataStruct { + s32 mName; + u16 mTelopNo; + u16 _6; + u16 _8; + // padding +}; + +/* ############################################################################################## */ +/* 803A7FB0-803A8238 0050D0 0288+00 2/2 0/0 0/0 .data TelopData */ +static TelopDataStruct TelopData[] = { + {'D05\0', 1101, 4201, 3}, {'D05A', 1101, -1, 0}, {'D05B', 1101, -1, 0}, + {'D04\0', 1102, -1, 1}, {'D04A', 1102, -1, 0}, {'D04B', 1102, -1, 0}, + {'D01\0', 1103, 4728, 3}, {'D01A', 1103, -1, 0}, {'D01B', 1103, -1, 0}, + {'D10\0', 1104, 4908, 3}, {'D10A', 1104, -1, 0}, {'D10B', 1104, -1, 0}, + {'D11\0', 1105, 5240, 3}, {'D11A', 1105, -1, 0}, {'D11B', 1105, -1, 0}, + {'D06\0', 1106, 5465, 3}, {'D06A', 1106, -1, 0}, {'D06B', 1106, -1, 0}, + {'D07\0', 1107, 5689, 3}, {'D07A', 1107, -1, 0}, {'D07B', 1107, -1, 0}, + {'D08\0', 1108, -1, 1}, {'D08A', 1108, -1, 0}, {'D08B', 1108, -1, 0}, + {'D08C', 1108, -1, 0}, {'D08D', 1108, -1, 0}, {'D09\0', 1109, -1, 1}, + {'D09A', 1109, -1, 0}, {'D09B', 1109, -1, 0}, {'D09C', 1109, -1, 0}, + {'F00\0', 1110, -1, 1}, {'F103', 1111, 10, 3}, {'R01\0', 1111, -1, 0}, + {'F109', 1112, -1, 1}, {'R109', 1112, -1, 0}, {'R209', 1112, -1, 0}, + {'F112', 1113, 1033, 3}, {'F113', 1114, 1024, 3}, {'F108', 1115, -1, 1}, + {'R108', 1115, -1, 0}, {'F115', 1116, 1054, 3}, {'F111', 1118, -1, 1}, + {'F124', 1119, -1, 1}, {'F114', 1120, 2048, 3}, {'F125', 1121, 2572, 3}, + {'F121', 1122, 1581, 3}, {'F122', 1122, 1581, 3}, {'F123', 1122, 1581, 3}, + {'F117', 1123, -1, 1}, {'F128', 1134, 814, 3}, {'R128', 1134, -1, 0}, + {'F127', 1140, -1, 1}, {'R127', 1140, -1, 0}, {'F126', 1141, -1, 1}}; + +/* 80450640-80450648 0000C0 0004+04 2/2 0/0 0/0 .sdata numTelopData */ +static s32 numTelopData = ARRAY_SIZE(TelopData); + +/* 8004372C-800437C4 03E06C 0098+00 2/2 0/0 0/0 .text getTelopNo__FPCc */ +static u16 getTelopNo(char const* pName) { + s32 val = + ((pName[3] == 'B' ? 'd' : pName[0]) << 0x18 | pName[4] << 0x10 | pName[5] << 8 | pName[6]); + for (s32 i = 0; i < numTelopData; i++) { + if (val == TelopData[i].mName) { + return TelopData[i].mTelopNo; + } + } + return 0xFFFF; +} + +/* 800437C4-800437F0 03E104 002C+00 1/1 0/0 0/0 .text getTelopNo__Fv */ +static u16 getTelopNo() { + return getTelopNo(dComIfGp_getStartStageName()); +} + +/* 800437F0-80043A14 03E130 0224+00 1/1 0/0 0/0 .text getStartTelopNo__Fv */ +static u16 getStartTelopNo() { + const char* startStageName = dComIfGp_getStartStageName(); + const char* lastPlayStateName = dComIfGp_getLastPlayStageName(); + + if (strcmp(startStageName, lastPlayStateName) == 0) { + return 0xFFFF; + } + + TelopDataStruct* telopData = NULL; + s32 val = ((startStageName[3] == 'B' ? 'd' : startStageName[0]) << 0x18 | + startStageName[4] << 0x10 | startStageName[5] << 8 | startStageName[6]); + for (s32 i = 0; i < numTelopData; i++) { + if (val == TelopData[i].mName) { + telopData = &TelopData[i]; + break; + } + } + + if (telopData == NULL || telopData->_8 == 0) { + return 0xFFFF; + } else if (telopData->_8 == 2 && telopData->_6 != 0xFFFF && + !dComIfGs_isEventBit(telopData->_6)) + { + return 0xFFFF; + } else if (telopData->_8 == 3 && telopData->_6 != 0xFFFF && + !dComIfGs_isStageSwitch(telopData->_6 >> 8, telopData->_6 & 0xFF)) + { + return 0xFFFF; + } else { + TelopDataStruct* lastTelopData = NULL; + val = ((lastPlayStateName[3] == 'B' ? 'd' : lastPlayStateName[0]) << 0x18 | + lastPlayStateName[4] << 0x10 | lastPlayStateName[5] << 8 | lastPlayStateName[6]); + + for (s32 i = 0; i < numTelopData; i++) { + if (val == TelopData[i].mName) { + lastTelopData = &TelopData[i]; + break; + } + } + + if (lastTelopData != NULL && telopData->mTelopNo == lastTelopData->mTelopNo) { + return 0xFFFF; + } else { + return telopData->mTelopNo; + } + } +} + +/* 80043A14-80043D60 03E354 034C+00 1/1 0/0 0/0 .text dEvDt_Next_Stage__Fii */ +static int dEvDt_Next_Stage(int index, int wipe_type) { + char* stage; + s16 point; + int mode; + s8 roomNo; + s8 layer; + s8 wipe; + s32 noVisit; + s32 wipe_time; + f32 hour; + f32 speed; + mode = 0; + wipe = wipe_type; + noVisit = true; + wipe_time = 0; + hour = 0; + bool setHour = false; + speed = 0; + + int* p_id = dComIfGp_evmng_getMyIntegerP(index, "ID"); + if (p_id != NULL) { + int id = *p_id; + s8 room_no = dComIfGp_roomControl_getStayNo(); + stage_scls_info_dummy_class* info; + + if (room_no == -1) { + info = dComIfGp_getStageSclsInfo(); + } else { + info = dComIfGp_roomControl_getStatusRoomDt(room_no)->mRoomDt.getSclsInfo(); + } + + if (info != NULL && id >= 0 && id < info->numEntries) { + stage_scls_info_class* stgInfo = &info->mEntries[id]; + stage = stgInfo->mStage; + point = stgInfo->mStart; + roomNo = (s8)stgInfo->mRoom; + layer = dStage_sclsInfo_getSceneLayer(stgInfo); + wipe = (s8)stgInfo->mWipe; + wipe_time = dStage_sclsInfo_getWipeTime(stgInfo); + + if (stgInfo->mWipe == 15) { + wipe = 0; + } + + int timeH = dStage_sclsInfo_getTimeH(stgInfo); + if (timeH >= 0 && timeH <= 23) { + setHour = true; + hour = timeH; + } + } + } + + char* stageP = dComIfGp_evmng_getMyStringP(index, "Stage"); + if (stageP != NULL) { + stage = stageP; + } + + int* pointP = dComIfGp_evmng_getMyIntegerP(index, "StartCode"); + if (pointP != NULL) { + point = *pointP; + } + + int* roomP = dComIfGp_evmng_getMyIntegerP(index, "RoomNo"); + if (roomP != NULL) { + roomNo = (s8)*roomP; + } + + int* layerP = dComIfGp_evmng_getMyIntegerP(index, "Layer"); + if (layerP != NULL) { + layer = *layerP; + } + + int* wipeP = dComIfGp_evmng_getMyIntegerP(index, "Wipe"); + if (wipeP != NULL) { + wipe = *wipeP; + } + + int* modeP = dComIfGp_evmng_getMyIntegerP(index, "Mode"); + if (modeP != NULL) { + mode = *modeP; + } + + f32* speedP = dComIfGp_evmng_getMyFloatP(index, "Speed"); + if (speedP != NULL) { + speed = *speedP; + } + + f32* hourP = dComIfGp_evmng_getMyFloatP(index, "Hour"); + if (hourP != NULL) { + hour = *hourP; + setHour = true; + } + + int* noVisitP = dComIfGp_evmng_getMyIntegerP(index, "NoVisit"); + if (noVisitP != NULL) { + noVisit = false; + } + + if (stage != NULL && point != -1) { + if (setHour) { + dKy_set_nexttime(15.0f * hour); + } + dComIfGp_setNextStage(stage, point, roomNo, layer, speed, mode, 1, wipe, 0, noVisit, + wipe_time); + } + return 1; +} + +/* 80043D60-80043DC8 03E6A0 0068+00 3/3 0/0 0/0 .text flagCheck__11dEvDtFlag_cFi */ +BOOL dEvDtFlag_c::flagCheck(int flag) { + if (flagMaxCheck(flag)) { + return FALSE; + } else { + if (mFlags[(u32)flag / 0x20] & (1 << (flag & 0x1F))) { + return TRUE; + } else { + return FALSE; + } + } +} + +/* 80043DC8-80043E30 03E708 0068+00 2/2 1/1 0/0 .text flagSet__11dEvDtFlag_cFi */ +BOOL dEvDtFlag_c::flagSet(int flag) { + if (flagMaxCheck(flag)) { + return FALSE; + } else { + mFlags[(u32)flag / 0x20] |= (1 << (flag & 0x1F)); + return TRUE; + } +} + +BOOL dEvDtFlag_c::flagMaxCheck(int flag) { + if (flag == -1) { + return TRUE; + } + + if (FlagMax <= flag) { + return TRUE; + } else { + return FALSE; + } +} + +void dEvDtFlag_c::init() { + for (int i = 0; i < 320; i++) { + mFlags[i] = 0; + } +} + +/* 80043E78-80043EFC 03E7B8 0084+00 0/0 1/1 0/0 .text finishCheck__12dEvDtEvent_cFv */ +int dEvDtEvent_c::finishCheck() { + for (int i = 0; i < 3; i++) { + int tmp = field_0x88[i]; + if (tmp == -1) { + return 1; + } + + if (!dComIfGp_getEventManager().flagCheck(tmp)) { + return 0; + } + } + return 1; +} + +/* 80043EFC-80043F70 03E83C 0074+00 0/0 1/1 0/0 .text forceFinish__12dEvDtEvent_cFv */ +int dEvDtEvent_c::forceFinish() { + for (int i = 0; i < 3; i++) { + int flag = field_0x88[i]; + if (flag == -1) { + return 1; + } + + dComIfGp_getEventManager().setFlag(flag); + } + return 1; +} + +/* 80043F70-80043FD8 03E8B0 0068+00 0/0 1/1 0/0 .text + * specialStaffProc__12dEvDtEvent_cFP12dEvDtStaff_c */ +void dEvDtEvent_c::specialStaffProc(dEvDtStaff_c* p_staff) { + for (int i = 0; i < mNStaff; i++) { + p_staff[mStaff[i]].specialProc(); + } +} + +/* 80043FD8-8004403C 03E918 0064+00 4/4 0/0 0/0 .text specialProc_WaitStart__12dEvDtStaff_cFi */ +void dEvDtStaff_c::specialProc_WaitStart(int index) { + int* timer = dComIfGp_evmng_getMyIntegerP(index, "Timer"); + if (timer == NULL) { + mWaitTimer = 0; + } else { + mWaitTimer = *timer; + } +} + +/* 8004403C-80044080 03E97C 0044+00 4/4 0/0 0/0 .text specialProc_WaitProc__12dEvDtStaff_cFi */ +void dEvDtStaff_c::specialProc_WaitProc(int param_0) { + if (mWaitTimer > 0) { + mWaitTimer--; + } else { + dComIfGp_evmng_cutEnd(param_0); + } +} + +/* 80044080-80044134 03E9C0 00B4+00 2/1 0/0 0/0 .text specialProc__12dEvDtStaff_cFv */ +void dEvDtStaff_c::specialProc() { + switch (mType) { + case TYPE_PACKAGE: + specialProcPackage(); + break; + case TYPE_DIRECTOR: + specialProcDirector(); + break; + case TYPE_TIMEKEEPER: + specialProcTimekeeper(); + break; + case TYPE_ALL: + dComIfGp_evmng_cutEnd(mIndex); + break; + case TYPE_EFFECT: + specialProcEffect(); + break; + case TYPE_CREATE: + specialProcCreate(); + dComIfGp_evmng_cutEnd(mIndex); + break; + case TYPE_SOUND: + specialProcSound(); + break; + case TYPE_MESSAGE: + specialProcMessage(); + break; + case TYPE_LIGHT: + specialProcLight(); + break; + } +} + +/* 80044134-80044170 03EA74 003C+00 0/0 1/1 0/0 .text init__12dEvDtStaff_cFv */ +void dEvDtStaff_c::init() { + mCurrentCut = mStartCut; + field_0x40 = true; + field_0x41 = false; + field_0x3c = -1; + if (mType == TYPE_CAMERA) { + dComIfGp_getEventManager().setCameraPlay(1); + } +} + +/* 80044170-80044190 03EAB0 0020+00 1/1 0/0 0/0 .text advanceCut__12dEvDtStaff_cFi */ +void dEvDtStaff_c::advanceCut(int cut) { + mCurrentCut = cut; + field_0x40 = true; + field_0x41 = false; + field_0x3c = -1; +} + +/* 80044190-80044324 03EAD0 0194+00 1/1 0/0 0/0 .text specialProcLight__12dEvDtStaff_cFv + */ +void dEvDtStaff_c::specialProcLight() { + int staffId = dComIfGp_evmng_getMyStaffId("LIGHT", NULL, 0); + if (staffId != -1) { + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + + if (dComIfGp_evmng_getIsAddvance(staffId)) { + f32* hourP; + + switch (*(int*)nowCutName) { + case 'CHAN': + hourP = dComIfGp_evmng_getMyFloatP(staffId, "Hour"); + if (hourP != NULL) { + dKy_instant_timechg(*hourP * 15.0f); + } + + int* weatherP = dComIfGp_evmng_getMyIntegerP(staffId, "Weather"); + if (weatherP != NULL) { + switch (*weatherP) { + case 0: + dKy_instant_rainchg(); + } + } + break; + case 'ADD_': + hourP = dComIfGp_evmng_getMyFloatP(staffId, "Hour"); + if (hourP != NULL) { + f32 hours = dComIfGs_getTime() * (1.0f / 15.0f); + hours += *hourP; + while (hours >= 24.0) { + hours -= 24.0; + } + dKy_instant_timechg(hours * 15.0f); + } + break; + } + } + dComIfGp_evmng_cutEnd(staffId); + } +} + +/* 80044324-80044A58 03EC64 0734+00 1/1 0/0 0/0 .text specialProcMessage__12dEvDtStaff_cFv */ +void dEvDtStaff_c::specialProcMessage() { + MessageData* data = (MessageData*)&mData; + StaffWork* work = &mWork; + int staffId = dComIfGp_evmng_getMyStaffId("MESSAGE", NULL, 0); + if (staffId == -1) { + return; + } + + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + if (dComIfGp_evmng_getIsAddvance(staffId)) { + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitStart(staffId); + break; + case 'CREA': + case 'SHOW': + work->_0 = UINT32_MAX; + work->mLMsg = NULL; + work->mMsgSubstanceNum = dComIfGp_evmng_getMySubstanceNum(staffId, "msgNo"); + work->mMsgSubstanceP = dComIfGp_evmng_getMyIntegerP(staffId, "msgNo"); + if (work->mMsgSubstanceNum < 1) { + work->mMsgSubstanceNum = dComIfGp_evmng_getMySubstanceNum(staffId, "No"); + work->mMsgSubstanceP = dComIfGp_evmng_getMyIntegerP(staffId, "No"); + } + work->mMsgNo = *work->mMsgSubstanceP; + data->unk = 0; + break; + case 'END\0': + case 'FINI': + work->mLMsg->mMode = 0x10; + break; + case 'CONT': + work->mLMsg->mMode = 0xF; + int* ptr = dComIfGp_evmng_getMyIntegerP(staffId, "msgNo"); + if (ptr == NULL) { + ptr = dComIfGp_evmng_getMyIntegerP(staffId, "No"); + } + work->mMsgNo = *ptr; + fopMsgM_messageSet(work->mMsgNo, 1000); + break; + case 'SAVE': + work->mMsgNo = 1; + int* typeP = dComIfGp_evmng_getMyIntegerP(staffId, "Type"); + if (typeP != NULL && *typeP == 1) { + work->mMsgNo = 2; + } + work->_0 = d_GameOver_Create(work->mMsgNo); + break; + case 'TELO': + int* forStartP = dComIfGp_evmng_getMyIntegerP(staffId, "ForStart"); + + if (forStartP != NULL && *forStartP != 0) { + work->mMsgNo = getStartTelopNo(); + } else { + char* stageP = dComIfGp_evmng_getMyStringP(staffId, "Stage"); + int* noP = dComIfGp_evmng_getMyIntegerP(staffId, "No"); + if (noP != NULL) { + work->mMsgNo = *noP; + } else if (stageP != NULL) { + work->mMsgNo = getTelopNo(stageP); + } else { + work->mMsgNo = getTelopNo(); + } + } + + data->unk = 0; + if (work->mMsgNo != 0xFFFF) { + work->_0 = fopMsgM_messageSetDemo(work->mMsgNo); + } + } + } + + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitProc(staffId); + break; + case 'CREA': + switch (data->unk) { + case 0: + work->_0 = fopMsgM_messageSet(work->mMsgNo, 1000); + if (work->_0 != UINT32_MAX) { + data->unk++; + } + break; + case 1: + work->mLMsg = fopMsgM_SearchByID(work->_0); + if (work->mLMsg != NULL) { + data->unk++; + } + break; + case 2: + dComIfGp_evmng_cutEnd(staffId); + break; + } + break; + case 'PUSH': + if (work->mLMsg->mMode == 0xE) { + dComIfGp_evmng_cutEnd(staffId); + } + break; + case 'TELO': + dComIfGp_evmng_cutEnd(staffId); + break; + case 'SHOW': + switch (data->unk) { + case 0: + work->_0 = fopMsgM_messageSet(work->mMsgNo, 1000); + if (work->_0 != UINT32_MAX) { + data->unk = 1; + } else { + break; + } + case 1: + work->mLMsg = fopMsgM_SearchByID(work->_0); + if (work->mLMsg == NULL) { + break; + } + + switch (work->mLMsg->mMode) { + case 0xE: + work->mLMsg->mMode = 0x10; + break; + case 0x11: + break; + case 0x12: + work->mLMsg->mMode = 0x13; + work->_0 = UINT32_MAX; + work->mLMsg = NULL; + work->mMsgSubstanceNum--; + if (work->mMsgSubstanceNum != 0) { + data->unk = 0; + work->mMsgSubstanceP++; + work->mMsgNo = *work->mMsgSubstanceP; + } else { + dComIfGp_evmng_cutEnd(staffId); + data->unk = 99; + } + break; + default: + break; + } + break; + default: + dComIfGp_evmng_cutEnd(staffId); + break; + } + break; + case 'DELE': + case 'FINI': + if (work->mLMsg == NULL) { + dComIfGp_evmng_cutEnd(staffId); + } else if (work->mLMsg->mMode == 0x12) { + work->mLMsg->mMode = 0x13; + work->_0 = UINT32_MAX; + work->mLMsg = NULL; + dComIfGp_evmng_cutEnd(staffId); + } + break; + case 'CONT': + dComIfGp_evmng_cutEnd(staffId); + break; + case 'END\0': + switch (work->mLMsg->mMode) { + case 0x11: + case 0x12: + dComIfGp_evmng_cutEnd(staffId); + break; + } + break; + case 'SAVE': + if (d_GameOver_CheckDelete(work->_0) && dComIfGp_getGameoverStatus() == 1) { + dComIfGp_evmng_cutEnd(staffId); + d_GameOver_Delete(work->_0); + } + break; + default: + dComIfGp_evmng_cutEnd(staffId); + break; + } +} + +/* 80044A58-80044CB8 03F398 0260+00 1/1 0/0 0/0 .text specialProcSound__12dEvDtStaff_cFv + */ +void dEvDtStaff_c::specialProcSound() { + SoundData* data = (SoundData*)&mData; + + int staffId = dComIfGp_evmng_getMyStaffId("SOUND", NULL, 0); + if (staffId == -1) { + return; + } + + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + if (dComIfGp_evmng_getIsAddvance(staffId)) { + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitStart(staffId); + break; + case 'STRM': + mDoAud_bgmStreamPlay(); + break; + case 'NOMS': + specialProc_WaitStart(staffId); + break; + case 'RIDD': + int* typeP = dComIfGp_evmng_getMyIntegerP(staffId, "Type"); + if (typeP != NULL && *typeP == 1) { + mDoAud_seStart(Z2SE_READ_RIDDLE_A, NULL, 0, 0); + } else { + mDoAud_seStart(Z2SE_READ_RIDDLE_B, NULL, 0, 0); + } + break; + case 'BGMS': + int* timerP = dComIfGp_evmng_getMyIntegerP(staffId, "Timer"); + if (timerP != NULL) { + mDoAud_bgmStop(*timerP); + } + } + } + + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitProc(staffId); + break; + case 'NOMS': + if (data->timer <= dDemo_c::getFrameNoMsg()) { + dComIfGp_evmng_cutEnd(staffId); + } + break; + default: + dComIfGp_evmng_cutEnd(staffId); + } +} + +/* 80044CB8-80044EE4 03F5F8 022C+00 1/1 0/0 0/0 .text specialProcCreate__12dEvDtStaff_cFv + */ +void dEvDtStaff_c::specialProcCreate() { + char* name; + u32 arg; + cXyz pos; + csXyz angle; + cXyz scale; + dStage_objectNameInf* objNameInf; + + int staffId = dComIfGp_evmng_getMyStaffId("CREATER", NULL, 0); + if (staffId == -1) { + return; + } + + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + if (dComIfGp_evmng_getIsAddvance(staffId)) { + switch (*(int*)nowCutName) { + case 'WAIT': + break; + case 'CREA': + name = dComIfGp_evmng_getMyStringP(staffId, "MAKECAST"); + objNameInf = dStage_searchName(name); + + int* argP = dComIfGp_evmng_getMyIntegerP(staffId, "ARG"); + if (argP == NULL) { + arg = UINT32_MAX; + } else { + arg = *argP; + } + + cXyz* posP = dComIfGp_evmng_getMyXyzP(staffId, "POS"); + if (posP == NULL) { + fopAc_ac_c* player_p = dComIfGp_getPlayer(0); + pos = player_p->current.pos; + } else { + pos = *posP; + } + + int* angleP = dComIfGp_evmng_getMyIntegerP(staffId, "ANGLE"); + if (angleP == NULL) { + angle.setall(0); + } else { + angle.set(angleP[0], angleP[1], angleP[2]); + } + + cXyz* scaleP = dComIfGp_evmng_getMyXyzP(staffId, "SCALE"); + if (scaleP == NULL) { + scale.setall(1.0f); + } else { + scale = *scaleP; + } + + fopAcM_create(objNameInf->mProcName, arg, &pos, dComIfGp_roomControl_getStayNo(), + &angle, &scale, objNameInf->mSubtype); + break; + } + } +} + +/* 80044EE4-80045878 03F824 0994+00 1/1 0/0 0/0 .text specialProcDirector__12dEvDtStaff_cFv */ +void dEvDtStaff_c::specialProcDirector() { + DirectorData* data = (DirectorData*)mData; + daPy_py_c* player = dComIfGp_getLinkPlayer(); + dEvt_control_c& evtControl = dComIfGp_getEvent(); + + int staffId = dComIfGp_evmng_getMyStaffId("DIRECTOR", NULL, 0); + if (staffId == -1) { + return; + } + + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + if (dComIfGp_evmng_getIsAddvance(staffId)) { + int* eventFlagP = dComIfGp_evmng_getMyIntegerP(staffId, "EventFlag"); + if (eventFlagP != NULL) { + dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[*eventFlagP]); + } + + int* eventFlagOffP = dComIfGp_evmng_getMyIntegerP(staffId, "EventFlagOff"); + if (eventFlagOffP != NULL) { + dComIfGs_offEventBit(dSv_event_flag_c::saveBitLabels[*eventFlagOffP]); + } + + int* switchTableP = dComIfGp_evmng_getMyIntegerP(staffId, "SwitchTable"); + int switchTable; + if (switchTableP != NULL) { + switchTable = *switchTableP; + } else { + switchTable = i_dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo()); + } + + int* switchBitP = dComIfGp_evmng_getMyIntegerP(staffId, "SwitchBit"); + if (switchBitP != NULL) { + dComIfGs_onStageSwitch(switchTable, *switchBitP); + } + + int* switchOffP = dComIfGp_evmng_getMyIntegerP(staffId, "SwitchOff"); + if (switchOffP != NULL) { + dComIfGs_offStageSwitch(switchTable, *switchOffP); + } + + int* tmpBitP = dComIfGp_evmng_getMyIntegerP(staffId, "TmpBit"); + if (tmpBitP != NULL) { + dComIfGs_onTmpBit(dSv_event_tmp_flag_c::tempBitLabels[*tmpBitP]); + } + + int* tmpOffP = dComIfGp_evmng_getMyIntegerP(staffId, "TmpBitOff"); + if (tmpOffP != NULL) { + dComIfGs_offTmpBit(dSv_event_tmp_flag_c::tempBitLabels[*tmpOffP]); + } + + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitStart(staffId); + break; + case 'PLAY': + if (strcmp(nowCutName, "PLAYER_NODRAW") == 0) { + player->onPlayerNoDraw(); + } else if (strcmp(nowCutName, "PLAYER_DRAW") == 0) { + player->offPlayerNoDraw(); + } + break; + case 'NEXT': + dEvDt_Next_Stage(staffId, 0xD); + break; + case 'SKIP': + char* zev = dComIfGp_evmng_getMyStringP(staffId, "Zev"); + // cast needed to match + void* pt = (void*)evtControl.getPt1(); + if (NULL == pt) { + pt = evtControl.getPt2(); + } + + if (zev != NULL) { + evtControl.setSkipZev(pt, zev); + } else { + evtControl.setSkipProc(pt, dEv_defaultSkipProc, 0); + } + break; + case 'FADE': + f32* rateP = dComIfGp_evmng_getMyFloatP(staffId, "Rate"); + int* colorP = dComIfGp_evmng_getMyIntegerP(staffId, "Color"); + + if (*rateP > 0) { + mDoGph_gInf_c::setFadeRate(0); + } + if (colorP != NULL) { + GXColor color; + color.r = colorP[0]; + color.g = colorP[1]; + color.b = colorP[2]; + color.a = colorP[3]; + mDoGph_gInf_c::fadeOut(*rateP, color); + } else { + mDoGph_gInf_c::fadeOut(*rateP); + } + break; + case 'VIBR': + specialProc_WaitStart(staffId); + int* patternP = dComIfGp_evmng_getMyIntegerP(staffId, "Pattern"); + int* typeP = dComIfGp_evmng_getMyIntegerP(staffId, "Type"); + dComIfGp_getVibration().StartQuake((u8*)patternP, 0, *typeP, cXyz(0, 1, 0)); + break; + case 'WIPE': + f32* wipeRateP = dComIfGp_evmng_getMyFloatP(staffId, "Rate"); + dDlst_list_c::wipeIn(-*wipeRateP); + if (*wipeRateP > 0) { + data->unk = 0; + } else { + data->unk = 1; + } + + int* soundP = dComIfGp_evmng_getMyIntegerP(staffId, "SOUND"); + if (soundP != NULL) { + switch (*soundP) { + case 0: + mDoAud_seStart(Z2SE_SY_DUMMY, NULL, 0, 0); + } + } + break; + case 'MAPT': + int* idP = dComIfGp_evmng_getMyIntegerP(staffId, "ID"); + data->unk = *idP; + dStage_MapEvent_dt_c* mapEvent = dEvt_control_c::searchMapEventData(data->unk); + if (mapEvent != NULL) { + if (mapEvent->mType == 0) { + data->unk2 = mapEvent->field_0x14; + } else { + data->unk2 = -1; + } + } else { + data->unk2 = 0; + } + break; + case 'CAST': + char* pt2Name = dComIfGp_evmng_getMyStringP(staffId, "Pt2"); + if (pt2Name != NULL) { + fopAc_ac_c* pt2 = fopAcM_searchFromName4Event(pt2Name, -1); + if (pt2 != NULL) { + evtControl.setPt2(pt2); + } + } + + char* ptTName = dComIfGp_evmng_getMyStringP(staffId, "PtT"); + if (ptTName != NULL) { + fopAc_ac_c* ptT = fopAcM_searchFromName4Event(ptTName, -1); + if (ptT != NULL) { + evtControl.setPtT(ptT); + } + } + + char* ptIName = dComIfGp_evmng_getMyStringP(staffId, "PtI"); + if (ptIName != NULL) { + fopAc_ac_c* ptI = fopAcM_searchFromName4Event(ptIName, -1); + if (ptI != NULL) { + evtControl.setPtI(ptI); + } + } + + char* ptDName = dComIfGp_evmng_getMyStringP(staffId, "PtD"); + if (ptDName != NULL) { + fopAc_ac_c* ptD = fopAcM_searchFromName4Event(ptDName, -1); + if (ptD != NULL) { + evtControl.setPtD(ptD); + } + } + break; + case 'SPEC': + int* specTypeP = dComIfGp_evmng_getMyIntegerP(staffId, "Type"); + if (specTypeP != NULL) { + switch (*specTypeP) { + case 8: + if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[506])) { + dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[566]); + } + + if (dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[507])) { + dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[567]); + } + } + } + break; + } + } + + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitProc(staffId); + break; + case 'FADE': + if (!mDoGph_gInf_c::isFade()) { + dComIfGp_evmng_cutEnd(staffId); + break; + } + + if (mDoGph_gInf_c::getFadeRate() >= 1) { + f32* rateP = dComIfGp_evmng_getMyFloatP(staffId, "Rate"); + if (*rateP > 0) { + dComIfGp_evmng_cutEnd(staffId); + } + } + break; + case 'NEXT': + break; + case 'VIBR': + if (data->unk2 > 0) { + data->unk2--; + if (data->unk2 == 0) { + dComIfGp_getVibration().StopQuake(0x1F); + } + } else { + dComIfGp_evmng_cutEnd(staffId); + } + break; + case 'WIPE': + if (data->unk != 0) { + if (dDlst_list_c::getWipeRate() == 0) { + dComIfGp_evmng_cutEnd(staffId); + } + } else { + if (dDlst_list_c::getWipeRate() >= 1) { + dComIfGp_evmng_cutEnd(staffId); + } + } + break; + case 'MAPT': + data->unk2--; + if (data->unk2 <= 0) { + dComIfGp_evmng_cutEnd(staffId); + } + break; + default: + dComIfGp_evmng_cutEnd(staffId); + break; + } +} + +/* 80045878-80045AFC 0401B8 0284+00 1/1 0/0 0/0 .text specialProcPackage__12dEvDtStaff_cFv */ +void dEvDtStaff_c::specialProcPackage() { + dMsgObject_c* msgObj = dComIfGp_getMsgObjectClass(); + if (!!msgObj) { + dMsgObject_demoMessageGroup(); + } + + int staffId = dComIfGp_evmng_getMyStaffId("PACKAGE", NULL, 0); + if (staffId == -1) { + return; + } + + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + if (dComIfGp_evmng_getIsAddvance(staffId)) { + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitStart(staffId); + break; + case 'PLAY': + char* fileName = dComIfGp_evmng_getMyStringP(staffId, "FileName"); + cXyz* offsetPos = dComIfGp_evmng_getMyXyzP(staffId, "OffsetPos"); + f32* offsetAngYP = dComIfGp_evmng_getMyFloatP(staffId, "OffsetAngY"); + f32 offsetAngY; + if (offsetAngYP != NULL) { + offsetAngY = *offsetAngYP; + } else { + offsetAngY = 0.0f; + } + + // should not save event from g_dComIfG_gameInfo to register + dComIfG_play_c& info = g_dComIfG_gameInfo.play; + u8* demoData = (u8*)info.getEvent().getStbDemoData(fileName); + dDemo_c::start(demoData, offsetPos, offsetAngY); + info.getEvent().setCullRate(10.0f); + + int* eventFlagP = dComIfGp_evmng_getMyIntegerP(staffId, "EventFlag"); + if (eventFlagP != NULL) { + dComIfGs_onEventBit(dSv_event_flag_c::saveBitLabels[*eventFlagP]); + } + break; + } + } + switch (*(int*)nowCutName) { + case 'WAIT': + specialProc_WaitProc(staffId); + break; + case 'PLAY': + dEvt_control_c& evtControl = dComIfGp_getEvent(); + if (dDemo_c::getMode() == 2) { + dStage_MapEvent_dt_c* event = evtControl.getStageEventDt(); + if (event != NULL && event->field_0x7 != 0xFF && !evtControl.chkFlag2(1)) { + dDemo_c::getControl()->referObject_control().suspend(100); + dComIfGp_evmng_cutEnd(staffId); + } else { + dDemo_c::end(); + } + } + + if (dDemo_c::getMode() == 0) { + dComIfGp_evmng_cutEnd(staffId); + } + break; + default: + dComIfGp_evmng_cutEnd(staffId); + break; + } +} + +/* 80045AFC-80045C34 04043C 0138+00 1/1 0/0 0/0 .text specialProcTimekeeper__12dEvDtStaff_cFv */ +void dEvDtStaff_c::specialProcTimekeeper() { + TimerKeeperData* dataP = (TimerKeeperData*)&mData; + int staffId = dComIfGp_evmng_getMyStaffId("TIMEKEEPER", NULL, 0); + if (staffId == -1) { + return; + } + + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + if (dComIfGp_evmng_getIsAddvance(staffId)) { + switch (*(int*)nowCutName) { + case 'COUN': + dataP->timer = *dComIfGp_evmng_getMyIntegerP(staffId, "Timer"); + break; + case 'WAIT': + break; + } + } + + switch (*(int*)nowCutName) { + case 'COUN': + if (dataP->timer > 0) { + dataP->timer--; + } else { + dComIfGp_evmng_cutEnd(staffId); + } + break; + case 'WAIT': + default: + dComIfGp_evmng_cutEnd(staffId); + } +} + +/* 80045C34-800460A8 040574 0474+00 1/1 0/0 0/0 .text specialProcEffect__12dEvDtStaff_cFv + */ +void dEvDtStaff_c::specialProcEffect() { + EffectData* data = (EffectData*)mData; + int staffId = dComIfGp_evmng_getMyStaffId("EFFECT", NULL, 0); + if (staffId == -1) { + return; + } + + char* nowCutName = dComIfGp_getEventManager().getMyNowCutName(staffId); + if (dComIfGp_evmng_getIsAddvance(staffId)) { + data->unk = 0; + switch (*(int*)nowCutName) { + case 'WAIT': { + int* timerP = dComIfGp_evmng_getMyIntegerP(staffId, "Timer"); + int timer; + if (timerP != NULL) { + timer = *timerP; + } else { + timer = 0; + } + data->unk = timer; + } break; + case 'SHOC': { + int* powerP = dComIfGp_evmng_getMyIntegerP(staffId, "Power"); + int power; + if (powerP != NULL) { + power = *powerP; + } else { + power = 5; + } + + int* typeP = dComIfGp_evmng_getMyIntegerP(staffId, "Type"); + int type; + if (typeP != NULL) { + type = *typeP; + } else { + type = 0xF; + } + dComIfGp_getVibration().StartShock(power, type, cXyz(0, 1, 0)); + } break; + case 'QUAK': { + int power; + int type; + int timer; + int random; + u8* pattern; + + int* timerP = dComIfGp_evmng_getMyIntegerP(staffId, "Timer"); + if (timerP != NULL) { + timer = *timerP; + } else { + timer = 30; + } + + data->unk = timer; + int* powerP = dComIfGp_evmng_getMyIntegerP(staffId, "Power"); + if (powerP != NULL) { + power = *powerP; + } else { + power = 5; + } + + int* typeP = dComIfGp_evmng_getMyIntegerP(staffId, "Type"); + if (typeP != NULL) { + type = *typeP; + } else { + type = 0xF; + } + + pattern = (u8*)dComIfGp_evmng_getMyStringP(staffId, "Pattern"); + if (pattern != NULL) { + int* randomP = dComIfGp_evmng_getMyIntegerP(staffId, "Random"); + if (randomP != NULL) { + random = *randomP; + } else { + random = 0; + } + dComIfGp_getVibration().StartQuake(pattern, random, type, cXyz(0, 1, 0)); + } else { + dComIfGp_getVibration().StartQuake(power, type, cXyz(0, 1, 0)); + } + } break; + case 'BLUR': { + int* timerP = dComIfGp_evmng_getMyIntegerP(staffId, "Timer"); + int timer; + if (timerP != NULL) { + timer = *timerP; + } else { + timer = 30; + } + int timer2 = data->unk = timer; + + f32* alphaP = dComIfGp_evmng_getMyFloatP(staffId, "Alpha"); + f32 alpha; + if (alphaP != NULL) { + alpha = *alphaP; + } else { + alpha = 0.8f; + } + + f32* scaleP = dComIfGp_evmng_getMyFloatP(staffId, "Scale"); + f32 scale; + if (scaleP != NULL) { + scale = *scaleP; + } else { + scale = 1.0f; + } + dCam_getBody()->StartBlure(timer2, NULL, alpha, scale); + } break; + } + } + if (data->unk != 0) { + data->unk--; + } + switch (*(int*)nowCutName) { + case 'WAIT': + if (data->unk == 0) { + dComIfGp_evmng_cutEnd(staffId); + } + break; + case 'QUAK': + if (data->unk == 0) { + dComIfGp_getVibration().StopQuake(0x1F); + dComIfGp_evmng_cutEnd(staffId); + } + break; + case 'BLUR': + if (data->unk == 0) { + dComIfGp_evmng_cutEnd(staffId); + } + break; + default: + dComIfGp_evmng_cutEnd(staffId); + break; + } +} + +/* 800460A8-80046138 0409E8 0090+00 1/1 0/0 0/0 .text startCheck__10dEvDtCut_cFv */ +int dEvDtCut_c::startCheck() { + for (int i = 0; i < 3; i++) { + int flag = this->getStartFlag(i); + if (flag == -1) { + if (i == 0) { + return -1; + } else { + return 1; + } + } + + if (!dEvDtFlagCheck(flag)) { + return 0; + } + } + return 1; +} + +/* 80046138-8004616C 040A78 0034+00 1/1 7/7 0/0 .text init__11dEvDtBase_cFv */ +int dEvDtBase_c::init() { + mHeaderP = NULL; + mEventP = NULL; + mStaffP = NULL; + mCutP = NULL; + mDataP = NULL; + mFDataP = NULL; + mIDataP = NULL; + mSDataP = NULL; + mRoomNo = -1; + return 0; +} + +/* 8004616C-8004628C 040AAC 0120+00 0/0 6/6 0/0 .text init__11dEvDtBase_cFPci */ +int dEvDtBase_c::init(char* p_data, int roomNo) { + init(); + if (p_data == NULL) { + return 0; + } else { + setHeaderP((event_binary_data_header*)p_data); + + if (getEventNum() > 0) { + setEventP((dEvDtEvent_c*)(p_data + getEventTop())); + } + + if (getStaffNum() > 0) { + setStaffP((dEvDtStaff_c*)(p_data + getStaffTop())); + } + + if (getCutNum() > 0) { + setCutP((dEvDtCut_c*)(p_data + getCutTop())); + } + + if (getDataNum() > 0) { + setDataP((dEvDtData_c*)(p_data + getDataTop())); + } + + if (getFDataNum() > 0) { + setFDataP((f32*)(p_data + getFDataTop())); + } + + if (getIDataNum() > 0) { + setIDataP((int*)(p_data + getIDataTop())); + } + + if (getSDataNum() > 0) { + setSDataP((char*)(p_data + getSDataTop())); + } + + mRoomNo = roomNo; + return getEventNum(); + } +} + +/* 8004628C-800462FC 040BCC 0070+00 0/0 1/1 0/0 .text advanceCut__11dEvDtBase_cFP12dEvDtEvent_c */ +void dEvDtBase_c::advanceCut(dEvDtEvent_c* p_event) { + for (int i = 0; i < p_event->getNStaff(); i++) { + advanceCutLocal(mStaffP + p_event->getStaff(i)); + } +} + +/* 800462FC-800463DC 040C3C 00E0+00 1/1 0/0 0/0 .text + * advanceCutLocal__11dEvDtBase_cFP12dEvDtStaff_c */ +BOOL dEvDtBase_c::advanceCutLocal(dEvDtStaff_c* p_staff) { + dEvDtCut_c* cut = &mCutP[p_staff->getCurrentCut()]; + if (dEvDtFlagCheck(cut->getFlagId()) && cut->getNext() != -1) { + switch (mCutP[cut->getNext()].startCheck()) { + case -1: + p_staff->advanceCut(cut->getNext()); + return TRUE; + case 1: + dEvDtFlagSet(cut->getFlagId()); + p_staff->advanceCut(cut->getNext()); + return TRUE; + } + } + p_staff->field_0x40 = false; + return FALSE; +}
\ No newline at end of file |
