summaryrefslogtreecommitdiff
path: root/src/d/actor/d_a_andsw2.cpp
diff options
context:
space:
mode:
authorLagoLunatic <LagoLunatic@users.noreply.github.com>2023-09-11 15:45:08 -0400
committerLagoLunatic <LagoLunatic@users.noreply.github.com>2023-09-11 15:45:08 -0400
commitaa37c40fa89c900578c39b2235bb9f933b24ddce (patch)
treed576410b3fa833ffdbd78c85140c28e8b6f137ad /src/d/actor/d_a_andsw2.cpp
parent7afd21aba28e9a600f10ea9d43e6c0ff2e678d53 (diff)
d_a_andsw2 OK
Diffstat (limited to 'src/d/actor/d_a_andsw2.cpp')
-rw-r--r--src/d/actor/d_a_andsw2.cpp276
1 files changed, 237 insertions, 39 deletions
diff --git a/src/d/actor/d_a_andsw2.cpp b/src/d/actor/d_a_andsw2.cpp
index 87c713d9..6817afbe 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,
+};