mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-27 16:12:54 -04:00
301 lines
8.0 KiB
C++
301 lines
8.0 KiB
C++
//
|
|
// Generated by dtk
|
|
// Translation Unit: d_a_andsw2.cpp
|
|
//
|
|
|
|
#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 */
|
|
u8 daAndsw2_c::getEventNo() {
|
|
return (orig.angle.x & 0x00FF) >> 0;
|
|
}
|
|
|
|
/* 00000084-00000090 .text getSwbit__10daAndsw2_cFv */
|
|
u8 daAndsw2_c::getSwbit() {
|
|
// Switch to set.
|
|
return (mBase.mParameters & 0x00FF0000) >> 16;
|
|
}
|
|
|
|
/* 00000090-0000009C .text getSwbit2__10daAndsw2_cFv */
|
|
u8 daAndsw2_c::getSwbit2() {
|
|
// First switch to check.
|
|
return (mBase.mParameters & 0xFF000000) >> 24;
|
|
}
|
|
|
|
/* 0000009C-000000A8 .text getType__10daAndsw2_cFv */
|
|
u8 daAndsw2_c::getType() {
|
|
return (mBase.mParameters & 0x0000FF00) >> 8;
|
|
}
|
|
|
|
/* 000000A8-000000B4 .text getTimer__10daAndsw2_cFv */
|
|
u8 daAndsw2_c::getTimer() {
|
|
return (orig.angle.z & 0x00FF) >> 0;
|
|
}
|
|
|
|
/* 000000B4-000000C0 .text getNum__10daAndsw2_cFv */
|
|
u8 daAndsw2_c::getNum() {
|
|
// Number of switches to check.
|
|
return (mBase.mParameters & 0x000000FF) >> 0;
|
|
}
|
|
|
|
/* 000000C0-00000130 .text getTopSw__10daAndsw2_cFv */
|
|
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 */
|
|
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 (!dComIfGs_isSwitch(topSw+i, getRoomNo())) {
|
|
return false;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000001D8-000002B0 .text daAndsw2_actionOnAll__FP10daAndsw2_c */
|
|
static 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();
|
|
dComIfGs_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 */
|
|
static 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();
|
|
dComIfGs_onSwitch(sw, room);
|
|
|
|
if (i_this->getType() == TYPE_CONTINUOUS) {
|
|
i_this->mAction = ACT_WAIT;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 00000380-00000438 .text daAndsw2_actionOrder__FP10daAndsw2_c */
|
|
static 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();
|
|
dComIfGs_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 */
|
|
static s32 daAndsw2_actionEvent(daAndsw2_c* i_this) {
|
|
if (dComIfGp_evmng_endCheck(i_this->mEventIdx)) {
|
|
if (i_this->getType() == TYPE_CONTINUOUS) {
|
|
i_this->mAction = ACT_OFF;
|
|
} else {
|
|
i_this->mAction = ACT_WAIT;
|
|
}
|
|
dComIfGp_event_reset();
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 000004BC-00000528 .text daAndsw2_actionOff__FP10daAndsw2_c */
|
|
static 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();
|
|
dComIfGs_offSwitch(sw, room);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 00000528-00000530 .text daAndsw2_actionWait__FP10daAndsw2_c */
|
|
static 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 || dComIfGs_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 = dComIfGp_evmng_getEventIdx(NULL, getEventNo());
|
|
break;
|
|
case TYPE_CONTINUOUS:
|
|
if (sw == 0xFF) {
|
|
// Switch invalid.
|
|
mAction = ACT_WAIT;
|
|
} else if (dComIfGs_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 = dComIfGp_evmng_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 cPhs_COMPLEATE_e;
|
|
}
|
|
|
|
/* 00000530-00000538 .text daAndsw2_Draw__FP10daAndsw2_c */
|
|
static s32 daAndsw2_Draw(daAndsw2_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 00000538-00000574 .text daAndsw2_Execute__FP10daAndsw2_c */
|
|
static s32 daAndsw2_Execute(daAndsw2_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* 00000574-0000057C .text daAndsw2_IsDelete__FP10daAndsw2_c */
|
|
static s32 daAndsw2_IsDelete(daAndsw2_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 0000057C-000005AC .text daAndsw2_Delete__FP10daAndsw2_c */
|
|
static s32 daAndsw2_Delete(daAndsw2_c* i_this) {
|
|
i_this->~daAndsw2_c();
|
|
return 1;
|
|
}
|
|
|
|
/* 000005AC-00000724 .text daAndsw2_Create__FP10fopAc_ac_c */
|
|
static 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 = {
|
|
fpcLy_CURRENT_e,
|
|
7,
|
|
fpcPi_CURRENT_e,
|
|
PROC_ANDSW2,
|
|
&g_fpcLf_Method.mBase,
|
|
sizeof(daAndsw2_c),
|
|
0,
|
|
0,
|
|
&g_fopAc_Method.base,
|
|
0x0136,
|
|
&l_daAndsw2_Method,
|
|
fopAcStts_UNK4000_e | fopAcStts_UNK40000_e,
|
|
fopAc_ACTOR_e,
|
|
fopAc_CULLBOX_6_e,
|
|
};
|