diff --git a/configure.py b/configure.py index 6eedf1043..aa442cf9a 100644 --- a/configure.py +++ b/configure.py @@ -341,7 +341,7 @@ LIBS = [ Rel(Matching, "f_pc_profile_lst", "f_pc/f_pc_profile_lst.cpp"), ActorRel(NonMatching, "d_a_agbsw0"), ActorRel(NonMatching, "d_a_andsw0"), - ActorRel(NonMatching, "d_a_andsw2"), + ActorRel( Matching, "d_a_andsw2"), ActorRel(NonMatching, "d_a_att"), ActorRel(NonMatching, "d_a_bflower"), ActorRel(NonMatching, "d_a_bita"), diff --git a/include/d/d_event.h b/include/d/d_event.h index 2281f342a..3f867bfb4 100644 --- a/include/d/d_event.h +++ b/include/d/d_event.h @@ -83,7 +83,7 @@ public: /* 0xE2 */ u8 mbInPhoto; /* 0xE3 */ u8 field_0xE3[0xE4 - 0xE3]; /* 0xE4 */ f32 mCullFarClipRatio; - /* 0xE8 */ s16 mStateFlags; + /* 0xE8 */ u16 mStateFlags; /* 0xEA */ u8 mTactFreeMStick[4]; /* 0xEE */ u8 mTactFreeCStick[4]; }; // Size = 0xF4 diff --git a/include/d/d_event_manager.h b/include/d/d_event_manager.h index b14995d7d..c1c2df190 100644 --- a/include/d/d_event_manager.h +++ b/include/d/d_event_manager.h @@ -34,11 +34,11 @@ public: void mainProc(); void runProc(); void getEventData(s16); - void getEventIdx(const char*, u8); + s16 getEventIdx(const char*, u8); void order(s16); void startCheck(s16); void startCheckOld(const char*); - void endCheck(s16); + BOOL endCheck(s16); void endCheckOld(const char*); void getMyStaffId(const char*, fopAc_ac_c*, int); void getIsAddvance(int); diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index a4ef4bce6..05a15eb1c 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -218,7 +218,7 @@ public: const cXyz& getPosition() const { return current.pos; } cXyz* getPositionP() { return ¤t.pos; } const csXyz& getAngle() const { return current.angle; } - s8 getRoomNo() const { return current.roomNo; } + int getRoomNo() const { return current.roomNo; } }; // Size: 0x290 STATIC_ASSERT(sizeof(fopAc_ac_c) == 0x290); diff --git a/src/d/actor/d_a_andsw2.cpp b/src/d/actor/d_a_andsw2.cpp index 87c713d99..6817afbeb 100644 --- a/src/d/actor/d_a_andsw2.cpp +++ b/src/d/actor/d_a_andsw2.cpp @@ -3,101 +3,299 @@ // Translation Unit: d_a_andsw2.cpp // -#include "d_a_andsw2.h" +#include "f_op/f_op_actor_mng.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" #include "dolphin/types.h" +enum { + ACT_ON_ALL, + ACT_TIMER, + ACT_ORDER, + ACT_EVENT, + ACT_OFF, + ACT_WAIT, +}; + +enum { + TYPE_ONE_OFF, + TYPE_CONTINUOUS, +}; + +struct daAndsw2_c : public fopAc_ac_c { +public: + u8 getEventNo(); + u8 getSwbit(); + u8 getSwbit2(); + u8 getType(); + u8 getTimer(); + u8 getNum(); + u8 getTopSw(); + BOOL chkAllSw2(); + + inline s32 execute(); + inline s32 create(); + +public: + u8 mAction; + s16 mTimer; + s16 mEventIdx; +}; + /* 00000078-00000084 .text getEventNo__10daAndsw2_cFv */ -void daAndsw2_c::getEventNo() { - /* Nonmatching */ +u8 daAndsw2_c::getEventNo() { + return (orig.angle.x & 0x00FF) >> 0; } /* 00000084-00000090 .text getSwbit__10daAndsw2_cFv */ -void daAndsw2_c::getSwbit() { - /* Nonmatching */ +u8 daAndsw2_c::getSwbit() { + // Switch to set. + return (mBase.mParameters & 0x00FF0000) >> 16; } /* 00000090-0000009C .text getSwbit2__10daAndsw2_cFv */ -void daAndsw2_c::getSwbit2() { - /* Nonmatching */ +u8 daAndsw2_c::getSwbit2() { + // First switch to check. + return (mBase.mParameters & 0xFF000000) >> 24; } /* 0000009C-000000A8 .text getType__10daAndsw2_cFv */ -void daAndsw2_c::getType() { - /* Nonmatching */ +u8 daAndsw2_c::getType() { + return (mBase.mParameters & 0x0000FF00) >> 8; } /* 000000A8-000000B4 .text getTimer__10daAndsw2_cFv */ -void daAndsw2_c::getTimer() { - /* Nonmatching */ +u8 daAndsw2_c::getTimer() { + return (orig.angle.z & 0x00FF) >> 0; } /* 000000B4-000000C0 .text getNum__10daAndsw2_cFv */ -void daAndsw2_c::getNum() { - /* Nonmatching */ +u8 daAndsw2_c::getNum() { + // Number of switches to check. + return (mBase.mParameters & 0x000000FF) >> 0; } /* 000000C0-00000130 .text getTopSw__10daAndsw2_cFv */ -void daAndsw2_c::getTopSw() { - /* Nonmatching */ +u8 daAndsw2_c::getTopSw() { + // Swbit2 is the first switch to check. + // If unspecified, start checking from the next switch after the switch to set (Swbit) instead. + if (getSwbit2() != 0xFF) { + return getSwbit2(); + } + if (getSwbit() != 0xFF) { + return getSwbit() + 1; + } + return 0xFF; } /* 00000130-000001D8 .text chkAllSw2__10daAndsw2_cFv */ -void daAndsw2_c::chkAllSw2() { - /* Nonmatching */ +BOOL daAndsw2_c::chkAllSw2() { + int topSw = getTopSw(); + int num = getNum(); + if (num == 0xFF || num == 0 || topSw == 0xFF) { + return false; + } + for (int i = 0; i < num; i++) { + if (!g_dComIfG_gameInfo.info.isSwitch(topSw+i, getRoomNo())) { + return false; + } + } + return true; } /* 000001D8-000002B0 .text daAndsw2_actionOnAll__FP10daAndsw2_c */ -void daAndsw2_actionOnAll(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_actionOnAll(daAndsw2_c* i_this) { + if (i_this->chkAllSw2()) { + if (i_this->getTimer() != 0xFF) { + i_this->mTimer = i_this->getTimer()*15; + i_this->mAction = ACT_TIMER; + } else if (i_this->mEventIdx != -1) { + i_this->mAction = ACT_ORDER; + } else { + int room = i_this->getRoomNo(); + int sw = i_this->getSwbit(); + g_dComIfG_gameInfo.info.onSwitch(sw, room); + + if (i_this->getType() == TYPE_CONTINUOUS) { + i_this->mAction = ACT_OFF; + } else { + i_this->mAction = ACT_WAIT; + } + } + } + return 1; } /* 000002B0-00000380 .text daAndsw2_actionTimer__FP10daAndsw2_c */ -void daAndsw2_actionTimer(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_actionTimer(daAndsw2_c* i_this) { + if (i_this->getType() == TYPE_CONTINUOUS && !i_this->chkAllSw2()) { + i_this->mAction = ACT_ON_ALL; + } else if (i_this->mTimer > 0) { + i_this->mTimer -= 1; + } else if (i_this->mEventIdx != -1) { + i_this->mAction = ACT_ORDER; + } else { + int room = i_this->getRoomNo(); + int sw = i_this->getSwbit(); + g_dComIfG_gameInfo.info.onSwitch(sw, room); + + if (i_this->getType() == TYPE_CONTINUOUS) { + i_this->mAction = ACT_WAIT; + } + } + return 1; } /* 00000380-00000438 .text daAndsw2_actionOrder__FP10daAndsw2_c */ -void daAndsw2_actionOrder(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_actionOrder(daAndsw2_c* i_this) { + if (i_this->mEvtInfo.checkCommandDemoAccrpt()) { + i_this->mAction = ACT_EVENT; + int room = i_this->getRoomNo(); + int sw = i_this->getSwbit(); + g_dComIfG_gameInfo.info.onSwitch(sw, room); + } else if (i_this->getType() == TYPE_CONTINUOUS && !i_this->chkAllSw2()) { + i_this->mAction = ACT_ON_ALL; + } else { + fopAcM_orderOtherEventId(i_this, i_this->mEventIdx, i_this->getEventNo(), 0xFFFF, 0, 1); + } + return 1; } /* 00000438-000004BC .text daAndsw2_actionEvent__FP10daAndsw2_c */ -void daAndsw2_actionEvent(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_actionEvent(daAndsw2_c* i_this) { + dComIfG_play_c* play = &g_dComIfG_gameInfo.play; + if (play->mEventMgr.endCheck(i_this->mEventIdx)) { + if (i_this->getType() == TYPE_CONTINUOUS) { + i_this->mAction = ACT_OFF; + } else { + i_this->mAction = ACT_WAIT; + } + play->mEvtCtrl.mStateFlags |= 8; + } + return 1; } /* 000004BC-00000528 .text daAndsw2_actionOff__FP10daAndsw2_c */ -void daAndsw2_actionOff(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_actionOff(daAndsw2_c* i_this) { + if (!i_this->chkAllSw2()) { + i_this->mAction = ACT_ON_ALL; + int room = i_this->getRoomNo(); + int sw = i_this->getSwbit(); + g_dComIfG_gameInfo.info.offSwitch(sw, room); + } + return 1; } /* 00000528-00000530 .text daAndsw2_actionWait__FP10daAndsw2_c */ -void daAndsw2_actionWait(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_actionWait(daAndsw2_c* i_this) { + return 1; +} + +s32 daAndsw2_c::execute() { + static s32 (*l_action[6])(daAndsw2_c*) = { + daAndsw2_actionOnAll, + daAndsw2_actionTimer, + daAndsw2_actionOrder, + daAndsw2_actionEvent, + daAndsw2_actionOff, + daAndsw2_actionWait, + }; + l_action[mAction](this); + return 1; +} + +s32 daAndsw2_c::create() { + int sw = getSwbit(); + + fopAcM_SetupActor(this, daAndsw2_c); + + switch (getType()) { + case TYPE_ONE_OFF: + if (sw == 0xFF || g_dComIfG_gameInfo.info.isSwitch(sw, getRoomNo())) { + // Switch invalid or already set. + mAction = ACT_WAIT; + } else { + // Switch not yet set, check for the condition to be met. + mAction = ACT_ON_ALL; + } + mEventIdx = g_dComIfG_gameInfo.play.mEventMgr.getEventIdx(NULL, getEventNo()); + break; + case TYPE_CONTINUOUS: + if (sw == 0xFF) { + // Switch invalid. + mAction = ACT_WAIT; + } else if (g_dComIfG_gameInfo.info.isSwitch(sw, getRoomNo())) { + // Switch already set, wait for the condition to no longer be met. + mAction = ACT_OFF; + } else { + // Switch not yet set, check for the condition to be met. + mAction = ACT_ON_ALL; + } + mEventIdx = g_dComIfG_gameInfo.play.mEventMgr.getEventIdx(NULL, getEventNo()); + break; + default: + // Invalid type, do nothing. + mAction = ACT_WAIT; + break; + } + + // Clear the parameters out of the current rotation. + shape_angle.z = 0; + shape_angle.x = 0; + current.angle.z = 0; + current.angle.x = 0; + + return 4; } /* 00000530-00000538 .text daAndsw2_Draw__FP10daAndsw2_c */ -void daAndsw2_Draw(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_Draw(daAndsw2_c* i_this) { + return 1; } /* 00000538-00000574 .text daAndsw2_Execute__FP10daAndsw2_c */ -void daAndsw2_Execute(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_Execute(daAndsw2_c* i_this) { + return i_this->execute(); } /* 00000574-0000057C .text daAndsw2_IsDelete__FP10daAndsw2_c */ -void daAndsw2_IsDelete(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_IsDelete(daAndsw2_c* i_this) { + return 1; } /* 0000057C-000005AC .text daAndsw2_Delete__FP10daAndsw2_c */ -void daAndsw2_Delete(daAndsw2_c*) { - /* Nonmatching */ +s32 daAndsw2_Delete(daAndsw2_c* i_this) { + i_this->~daAndsw2_c(); + return 1; } /* 000005AC-00000724 .text daAndsw2_Create__FP10fopAc_ac_c */ -void daAndsw2_Create(fopAc_ac_c*) { - /* Nonmatching */ +s32 daAndsw2_Create(fopAc_ac_c* ac) { + return ((daAndsw2_c*)ac)->create(); } +static actor_method_class l_daAndsw2_Method = { + (process_method_func)daAndsw2_Create, + (process_method_func)daAndsw2_Delete, + (process_method_func)daAndsw2_Execute, + (process_method_func)daAndsw2_IsDelete, + (process_method_func)daAndsw2_Draw, +}; + +extern actor_process_profile_definition g_profile_ANDSW2 = { + -3, + 7, + 0xFFFD, + PROC_ANDSW2, + &g_fpcLf_Method.mBase, + sizeof(daAndsw2_c), + 0, + 0, + &g_fopAc_Method.base, + 0x0136, + &l_daAndsw2_Method, + 0x00044000, + fopAc_ACTOR_e, + fopAc_CULLBOX_6_e, +}; diff --git a/src/d/d_event_manager.cpp b/src/d/d_event_manager.cpp index 2caef5fae..b98ab9763 100644 --- a/src/d/d_event_manager.cpp +++ b/src/d/d_event_manager.cpp @@ -97,7 +97,7 @@ void dEvent_manager_c::getEventData(short) { } /* 800743AC-800744AC .text getEventIdx__16dEvent_manager_cFPCcUc */ -void dEvent_manager_c::getEventIdx(const char*, unsigned char) { +s16 dEvent_manager_c::getEventIdx(const char*, unsigned char) { /* Nonmatching */ } @@ -117,7 +117,7 @@ void dEvent_manager_c::startCheckOld(const char*) { } /* 80074564-800745A4 .text endCheck__16dEvent_manager_cFs */ -void dEvent_manager_c::endCheck(short) { +BOOL dEvent_manager_c::endCheck(short) { /* Nonmatching */ }