mirror of
https://github.com/zeldaret/tp
synced 2026-05-23 06:54:28 -04:00
990 lines
24 KiB
C++
990 lines
24 KiB
C++
/**
|
|
* @file d_a_obj_kshutter.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_kshutter.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/actor/d_a_obj_keyhole.h"
|
|
#include "d/d_meter2_info.h"
|
|
|
|
enum S_shut00_RES_File_ID {
|
|
/* BMDR */
|
|
/* 0x5 */ BMDR_S_SHUT_ROU = 0x5,
|
|
|
|
/* DZB */
|
|
/* 0x8 */ DZB_S_SHUT00_S_SHUT_ROU = 0x8,
|
|
|
|
/* EVT */
|
|
/* 0xB */ EVT_S_SHUT00_EVENT_LIST = 0xB,
|
|
};
|
|
|
|
enum Lv3shut00_RES_File_ID {
|
|
/* BMDR */
|
|
/* 0x5 */ BMDR_DOOR_SHUTTER_00 = 0x5,
|
|
|
|
/* DZB */
|
|
/* 0x8 */ DZB_LV3SHUT00_S_SHUT_ROU = 0x8,
|
|
|
|
/* EVT */
|
|
/* 0xB */ EVT_LV3SHUT00_EVENT_LIST = 0xB,
|
|
};
|
|
|
|
enum K_l3bdoor_RES_File_ID {
|
|
/* BMDR */
|
|
/* 0x5 */ BMDR_K_L3BDOOR = 0x5,
|
|
|
|
/* DZB */
|
|
/* 0x8 */ DZB_K_L3BDOOR = 0x8,
|
|
|
|
/* EVT */
|
|
/* 0xB */ EVT_K_L3BDOOR_EVENT_LIST = 0xB,
|
|
};
|
|
|
|
enum V_Shutter_RES_File_ID {
|
|
/* BCK */
|
|
/* 0x5 */ BCK_V_SHUTTER = 0x5,
|
|
|
|
/* BMDR */
|
|
/* 0x8 */ BMDR_V_SHUTTER = 0x8,
|
|
|
|
/* DZB */
|
|
/* 0xB */ DZB_V_SHUTTER = 0xB,
|
|
};
|
|
|
|
enum DoorY00_RES_File_ID {
|
|
/* BCK */
|
|
/* 0x4 */ BCK_MD_OJ_DOOROPC = 0x4,
|
|
/* 0x5 */ BCK_OJ_DOORCLOSEC,
|
|
/* 0x6 */ BCK_OJ_DOOROPC,
|
|
|
|
/* EVT */
|
|
/* 0x9 */ EVT_DOORY00_EVENT_LIST = 0x9,
|
|
};
|
|
|
|
enum DoorT00_RES_File_ID {
|
|
/* BCK */
|
|
/* 0x4 */ BCK_MD_OJ_DOOROPD = 0x4,
|
|
/* 0x5 */ BCK_OJ_DOORCLOSED,
|
|
/* 0x6 */ BCK_OJ_DOOROPD,
|
|
|
|
/* EVT */
|
|
/* 0x9 */ EVT_DOORT00_EVENT_LIST = 0x9,
|
|
};
|
|
|
|
enum Demo_Action {
|
|
/* 0x0 */ DEMO_ACT_WAIT,
|
|
/* 0x1 */ DEMO_ACT_ADJUSTMENT,
|
|
/* 0x2 */ DEMO_ACT_UNLOCK,
|
|
/* 0x3 */ DEMO_ACT_OPEN,
|
|
/* 0x4 */ DEMO_ACT_PLY_NODISP,
|
|
/* 0x5 */ DEMO_ACT_PLY_DISP,
|
|
};
|
|
|
|
enum Type {
|
|
/* 0x0 */ TYPE_0,
|
|
/* 0x1 */ TYPE_1,
|
|
/* 0x2 */ TYPE_2,
|
|
/* 0x3 */ TYPE_L3BOSS,
|
|
/* 0x4 */ TYPE_V_SHUTTER,
|
|
};
|
|
|
|
void daObjKshtr_c::initBaseMtx() {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
MTXCopy(mDoMtx_stack_c::get(), mMtx);
|
|
mpModel->setBaseScale(scale);
|
|
setBaseMtx();
|
|
}
|
|
|
|
void daObjKshtr_c::setBaseMtx() {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + field_0x5fc, current.pos.z);
|
|
|
|
if (mType == TYPE_V_SHUTTER) {
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
} else {
|
|
mDoMtx_stack_c::YrotM(shape_angle.y + 0x7FFF);
|
|
}
|
|
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
|
|
|
|
if (mpBckAnm != NULL) {
|
|
mDoMtx_stack_c::copy(mpModel->getAnmMtx(0));
|
|
mDoMtx_stack_c::multVecZero(&mSePos);
|
|
}
|
|
}
|
|
|
|
static int const l_bmd[5] = {
|
|
BMDR_S_SHUT_ROU, BMDR_S_SHUT_ROU, BMDR_DOOR_SHUTTER_00, BMDR_K_L3BDOOR, BMDR_V_SHUTTER,
|
|
};
|
|
|
|
static int const l_dzb[5] = {
|
|
DZB_S_SHUT00_S_SHUT_ROU, DZB_S_SHUT00_S_SHUT_ROU, DZB_LV3SHUT00_S_SHUT_ROU, DZB_K_L3BDOOR, DZB_V_SHUTTER,
|
|
};
|
|
|
|
static u32 const l_heap_size[5] = {
|
|
0x1300, 0x1300, 0x1300, 0x1300, 0x20D0,
|
|
};
|
|
|
|
static cull_box const l_cull_box = {
|
|
{-450.0f, 0.0f, -50.0f}, {450.0f, 700.0f, 150.0f},
|
|
};
|
|
|
|
static char* l_arcName[5] = {
|
|
"S_shut00",
|
|
"S_shut00",
|
|
"Lv3shut00",
|
|
"K_l3bdoor",
|
|
"V_Shutter",
|
|
};
|
|
|
|
static char* l_anmName[10] = {
|
|
"oj_DoorOpC.bck",
|
|
"md_oj_DoorOpC.bck",
|
|
"oj_DoorOpC.bck",
|
|
"md_oj_DoorOpC.bck",
|
|
"oj_DoorOpD.bck",
|
|
"md_oj_DoorOpD.bck",
|
|
NULL,
|
|
NULL,
|
|
"V_Shutter.bck",
|
|
"V_Shutter.bck",
|
|
};
|
|
|
|
static char* l_eventName[10] = {
|
|
"KEY_JAIL_00",
|
|
"KEY_JAIL_WOLF_00",
|
|
"KEY_JAIL_00",
|
|
"KEY_JAIL_WOLF_00",
|
|
"KEY_JAIL_01",
|
|
"KEY_JAIL_WOLF_01",
|
|
"DEFAULT_BS_SHUTTER_L3_F",
|
|
"DEFAULT_BS_SHUTTER_L3_F",
|
|
NULL,
|
|
NULL,
|
|
};
|
|
|
|
int daObjKshtr_c::Create() {
|
|
if (!fopAcM_isSwitch(this, mSwNo)) {
|
|
field_0x5ec = false;
|
|
field_0x5fc = 0.0f;
|
|
attention_info.position.y += 150.0f;
|
|
eyePos.y += 150.0f;
|
|
attention_info.flags = 0x20;
|
|
|
|
if (mIsCheckKey) {
|
|
mAction = 0;
|
|
} else {
|
|
mAction = 0;
|
|
}
|
|
|
|
if (mpBckAnm != NULL) {
|
|
mpBckAnm->setFrame(0.0f);
|
|
mpBckAnm->setPlaySpeed(0.0f);
|
|
}
|
|
} else {
|
|
field_0x5ec = true;
|
|
|
|
if ((s8)mType != TYPE_L3BOSS) {
|
|
mpBckAnm->setFrame(mpBckAnm->getEndFrame());
|
|
} else {
|
|
field_0x5fc = -450.0f;
|
|
}
|
|
|
|
offDzb();
|
|
|
|
if (mIsCheckKey) {
|
|
mAction = 2;
|
|
} else {
|
|
mAction = 2;
|
|
}
|
|
}
|
|
|
|
if (mType == TYPE_V_SHUTTER) {
|
|
fopAcM_OffStatus(this, fopAcM_STATUS_UNK_0x100);
|
|
}
|
|
|
|
initBaseMtx();
|
|
fopAcM_SetMtx(this, mMtx);
|
|
fopAcM_setCullSizeBox(this, l_cull_box.min.x, l_cull_box.min.y, l_cull_box.min.z, l_cull_box.max.x, l_cull_box.max.y, l_cull_box.max.z);
|
|
|
|
if (checkKey() == 1) {
|
|
eventInfo.setArchiveName(l_arcName[mType]);
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
field_0x5f0[i] = dComIfGp_getEventManager().getEventIdx(this, l_eventName[i + mType * 2], 0xFF);
|
|
}
|
|
|
|
mEvId = getEvId();
|
|
} else {
|
|
mEvId = getEvId();
|
|
field_0x5f0[0] = dComIfGp_getEventManager().getEventIdx(this, mEvId);
|
|
field_0x5f0[1] = -1;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void daObjKshtr_c::offDzb() {
|
|
if (mpBgW != NULL && mpBgW->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW);
|
|
}
|
|
}
|
|
|
|
static char* l_anmArcName[5] = {
|
|
"DoorY00",
|
|
"DoorY00",
|
|
"DoorT00",
|
|
NULL,
|
|
"V_Shutter",
|
|
};
|
|
|
|
int daObjKshtr_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName[mType], l_bmd[mType]);
|
|
|
|
JUT_ASSERT(429, modelData != NULL);
|
|
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
|
|
if (mpModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (l_anmArcName[mType] != NULL) {
|
|
int index;
|
|
if (daPy_py_c::checkNowWolf()) {
|
|
index = mType * 2 + 1;
|
|
} else {
|
|
index = mType << 1;
|
|
}
|
|
|
|
J3DAnmTransform* anm = (J3DAnmTransform*)dComIfG_getObjectRes(l_anmArcName[mType], l_anmName[index]);
|
|
|
|
JUT_ASSERT(446, anm != NULL);
|
|
|
|
mpBckAnm = new mDoExt_bckAnm();
|
|
if (mpBckAnm == NULL || mpBckAnm->init(anm, 1, 0, 1.0f, 0, -1, false) == 0) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
#if DEBUG
|
|
if (checkKey() != 0) {
|
|
mIsCheckKey = true;
|
|
}
|
|
#endif
|
|
|
|
return 1;
|
|
}
|
|
|
|
void daObjKshtr_c::initKey() {
|
|
if (!field_0x61e) {
|
|
if ((int)checkKey() != 0) {
|
|
mIsCheckKey = true;
|
|
}
|
|
|
|
field_0x61e = true;
|
|
mKeyHoleId = fpcM_ERROR_PROCESS_ID_e;
|
|
|
|
if (!fopAcM_isSwitch(this, mSwNo) && mIsCheckKey) {
|
|
cXyz sp20(0.0f, 0.0f, 35.0f);
|
|
|
|
u32 uVar1 = 0xFFFFFFFF;
|
|
|
|
if (mType == TYPE_L3BOSS) {
|
|
uVar1 = 0xFFFFFF03;
|
|
} else {
|
|
uVar1 = 0xFFFFFFFF;
|
|
}
|
|
|
|
mKeyHoleId = fopAcM_createChildFromOffset(PROC_OBJ_KEYHOLE, fopAcM_GetID(this), uVar1, &sp20, fopAcM_GetRoomNo(this), NULL, &scale, -1, NULL);
|
|
}
|
|
}
|
|
}
|
|
|
|
cPhs__Step daObjKshtr_c::phase_0() {
|
|
if (!field_0x619) {
|
|
mHomeAngleZ = home.angle.z;
|
|
mHomeAngleX = home.angle.x;
|
|
home.angle.x = current.angle.x = shape_angle.x = 0;
|
|
home.angle.z = current.angle.z = shape_angle.z = 0;
|
|
field_0x619 = true;
|
|
}
|
|
|
|
mType = getType() + 1;
|
|
mSwNo = getSwNo();
|
|
|
|
#if DEBUG
|
|
if (mSwNo == 0xFF) {
|
|
OS_REPORT_ERROR("鍵付き壁ドア:スイッチ指定がありません\n"); // Locked wall door: No switch specification
|
|
return cPhs_ERROR_e;
|
|
}
|
|
#else
|
|
initKey();
|
|
#endif
|
|
|
|
#if DEBUG
|
|
int r28 = 5;
|
|
if (mType > r28) {
|
|
OS_REPORT_ERROR("鍵付き壁ドア:引数0のタイプ指定が不正値です\n"); // Locked wall door: The type specification for argument 0 is invalid
|
|
|
|
return cPhs_ERROR_e;
|
|
}
|
|
#endif
|
|
|
|
cPhs__Step phase;
|
|
if (l_anmArcName[mType] != NULL) {
|
|
phase = (cPhs__Step)dComIfG_resLoad(&mPhase2, l_anmArcName[mType]);
|
|
if (phase != cPhs_COMPLEATE_e) {
|
|
return phase;
|
|
}
|
|
}
|
|
|
|
phase = (cPhs__Step)dComIfG_resLoad(&mPhase1, l_arcName[mType]);
|
|
if (phase == cPhs_COMPLEATE_e) {
|
|
phase = (cPhs__Step)MoveBGCreate(l_arcName[mType], l_dzb[mType], NULL, l_heap_size[mType], NULL);
|
|
if (phase == cPhs_ERROR_e) {
|
|
return phase;
|
|
}
|
|
|
|
mPhase++;
|
|
OS_REPORT("KSHTR PARAM:0x%x\n", fopAcM_GetParam(this));
|
|
return cPhs_INIT_e;
|
|
}
|
|
return phase;
|
|
}
|
|
|
|
cPhs__Step daObjKshtr_c::phase_1() {
|
|
if (mKeyHoleId != fpcM_ERROR_PROCESS_ID_e) {
|
|
obj_keyhole_class* keyhole_p = (obj_keyhole_class*)fopAcM_SearchByID(mKeyHoleId);
|
|
|
|
if (keyhole_p != NULL) {
|
|
if (fopAcM_isSwitch(this, mSwNo)) {
|
|
keyhole_p->setOpenEnd();
|
|
|
|
OS_REPORT("鍵檻:鍵開いてる状態セット!\n"); // Locked cage: unlocked!\n
|
|
}
|
|
|
|
mPhase++;
|
|
}
|
|
} else {
|
|
mPhase++;
|
|
}
|
|
|
|
return cPhs_INIT_e;
|
|
}
|
|
|
|
cPhs__Step daObjKshtr_c::phase_2() {
|
|
return cPhs_COMPLEATE_e;
|
|
}
|
|
|
|
cPhs__Step daObjKshtr_c::create1st() {
|
|
static daObjKshtr_c::PhaseFunc l_ct_func[3] = {
|
|
&daObjKshtr_c::phase_0,
|
|
&daObjKshtr_c::phase_1,
|
|
&daObjKshtr_c::phase_2,
|
|
};
|
|
|
|
return (this->*l_ct_func[mPhase])();
|
|
}
|
|
|
|
void daObjKshtr_c::event_proc_call() {
|
|
static daObjKshtr_c::ActionFunc l_func[3] = {
|
|
&daObjKshtr_c::actionWaitEvent,
|
|
&daObjKshtr_c::actionEvent,
|
|
&daObjKshtr_c::actionDead,
|
|
};
|
|
|
|
(this->*l_func[mAction])();
|
|
}
|
|
|
|
void daObjKshtr_c::event_proc_call2() {
|
|
static daObjKshtr_c::ActionFunc l_func[4] = {
|
|
&daObjKshtr_c::actionWaitEvent2,
|
|
&daObjKshtr_c::actionEvent2,
|
|
&daObjKshtr_c::actionDead2,
|
|
&daObjKshtr_c::actionOpen,
|
|
};
|
|
|
|
(this->*l_func[mAction])();
|
|
}
|
|
|
|
int daObjKshtr_c::Execute(Mtx** param_1) {
|
|
if (checkKey() == 1) {
|
|
event_proc_call();
|
|
} else {
|
|
event_proc_call2();
|
|
}
|
|
|
|
*param_1 = &mBgMtx;
|
|
setBaseMtx();
|
|
|
|
return 1;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::checkArea() {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
cXyz sp78;
|
|
cXyz sp84(player->attention_info.position);
|
|
sp84.y = player->current.pos.y;
|
|
sp78 = sp84 - current.pos;
|
|
f32 fVar1 = sp78.abs2XZ();
|
|
cXyz sp90;
|
|
sp90.set(cM_ssin(home.angle.y), 0.0f, cM_scos(home.angle.y));
|
|
|
|
if (fVar1 > 62500.0f) {
|
|
return FALSE;
|
|
}
|
|
|
|
sp78.normalize();
|
|
|
|
f32 fVar2 = sp78.inprodXZ(sp90);
|
|
fVar2 *= fVar1 * fVar2;
|
|
if (fVar2 > 12100.0f) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (fVar1 - fVar2 > 12100.0f) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (abs((s16)(current.angle.y - player->current.angle.y)) >= 0x5000) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::checkOpen() {
|
|
if (mType == TYPE_L3BOSS) {
|
|
if (!dComIfGs_isDungeonItemBossKey()) {
|
|
return false;
|
|
}
|
|
} else if (dComIfGs_getKeyNum() == 0) {
|
|
return false;
|
|
}
|
|
|
|
if (!checkArea()) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int daObjKshtr_c::getDemoAction() {
|
|
static char* action_table[6] = {
|
|
"WAIT",
|
|
"ADJUSTMENT",
|
|
"UNLOCK",
|
|
"OPEN",
|
|
"PLY_NODISP",
|
|
"PLY_DISP",
|
|
};
|
|
|
|
return dComIfGp_evmng_getMyActIdx(mStaffId, action_table, 6, 0, 0);
|
|
}
|
|
|
|
BOOL daObjKshtr_c::demoProc2() {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
mStaffId = dComIfGp_evmng_getMyStaffId("JAIL_DOOR", NULL, 0);
|
|
int demoAction = getDemoAction();
|
|
|
|
if (dComIfGp_evmng_getIsAddvance(mStaffId) != 0) {
|
|
switch (demoAction) {
|
|
case DEMO_ACT_WAIT: {
|
|
int* timer = dComIfGp_evmng_getMyIntegerP(mStaffId, "Timer");
|
|
if (timer == NULL) {
|
|
mTimer = 1;
|
|
} else {
|
|
mTimer = *timer;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case DEMO_ACT_OPEN:
|
|
openInit();
|
|
break;
|
|
|
|
case DEMO_ACT_UNLOCK:
|
|
keyUnlockInit();
|
|
break;
|
|
|
|
case DEMO_ACT_ADJUSTMENT:
|
|
field_0x605 = 5;
|
|
break;
|
|
|
|
case DEMO_ACT_PLY_DISP:
|
|
player->offPlayerNoDraw();
|
|
player->offPlayerShadowNoDraw();
|
|
break;
|
|
|
|
case DEMO_ACT_PLY_NODISP:
|
|
player->onPlayerNoDraw();
|
|
player->onPlayerShadowNoDraw();
|
|
break;
|
|
}
|
|
}
|
|
|
|
switch (demoAction) {
|
|
case DEMO_ACT_WAIT:
|
|
if (cLib_calcTimer(&mTimer) == 0) {
|
|
dComIfGp_evmng_cutEnd(mStaffId);
|
|
}
|
|
break;
|
|
|
|
case DEMO_ACT_OPEN:
|
|
if (openProc()) {
|
|
dComIfGp_evmng_cutEnd(mStaffId);
|
|
}
|
|
break;
|
|
|
|
case DEMO_ACT_UNLOCK:
|
|
if (keyUnlock()) {
|
|
dComIfGp_evmng_cutEnd(mStaffId);
|
|
}
|
|
break;
|
|
|
|
case DEMO_ACT_ADJUSTMENT:
|
|
if (adjustmentProc()) {
|
|
dComIfGp_evmng_cutEnd(mStaffId);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
dComIfGp_evmng_cutEnd(mStaffId);
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::adjustmentProc() {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
cXyz sp18, sp24;
|
|
|
|
sp24 = player->current.pos;
|
|
s16 angleY = player->shape_angle.y;
|
|
cLib_addCalcAngleS2(&angleY, shape_angle.y + 0x7FFF, 5, 3000);
|
|
|
|
if (field_0x605 != 0) {
|
|
player->setPlayerPosAndAngle(&sp24, angleY, 0);
|
|
field_0x605--;
|
|
} else {
|
|
player->setPlayerPosAndAngle(&sp24, shape_angle.y + 0x7FFF, 0);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::keyUnlockInit() {
|
|
obj_keyhole_class* keyhole_p = (obj_keyhole_class*)fopAcM_SearchByID(mKeyHoleId);
|
|
if (keyhole_p != NULL) {
|
|
keyhole_p->setOpen();
|
|
}
|
|
|
|
dComIfGp_setItemKeyNumCount(-1);
|
|
fopAcM_seStart(this, Z2SE_OBJ_DOOR_CHAIN_LOCK_OPEN, 0);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::keyUnlock() {
|
|
obj_keyhole_class* keyhole_p = (obj_keyhole_class*)fopAcM_SearchByID(mKeyHoleId);
|
|
if (keyhole_p != NULL && keyhole_p->checkOpenEnd()) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::openInit() {
|
|
field_0x5fc = 0.0f;
|
|
speedF = 0.0f;
|
|
gravity = 0.0f;
|
|
anmInit();
|
|
offDzb();
|
|
|
|
switch (mType) {
|
|
case TYPE_0:
|
|
case TYPE_1:
|
|
break;
|
|
|
|
case TYPE_L3BOSS:
|
|
fopAcM_seStart(this, Z2SE_OBJ_LV3_SHTR_DW_STOP, 0);
|
|
break;
|
|
|
|
case TYPE_V_SHUTTER:
|
|
eyePos = current.pos;
|
|
fopAcM_seStart(this, Z2SE_OBJ_VSHUTR, 0);
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::openProc() {
|
|
switch (mType) {
|
|
case TYPE_0:
|
|
case TYPE_1:
|
|
return openProc_type1();
|
|
|
|
default:
|
|
return openProc_type2();
|
|
|
|
case TYPE_L3BOSS:
|
|
return openProc_typeL3Boss();
|
|
|
|
case TYPE_V_SHUTTER:
|
|
if (mpBckAnm->play() != 0) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
BOOL daObjKshtr_c::openProc_type1() {
|
|
BOOL rv = mpBckAnm->play();
|
|
|
|
if (mpBckAnm->getFrame() == 1.0f) {
|
|
dComIfGp_particle_set(0x8331, ¤t.pos, &shape_angle, NULL, 0xFF, NULL, fopAcM_GetRoomNo(this), NULL, NULL, NULL);
|
|
dComIfGp_particle_set(0x8332, ¤t.pos, &shape_angle, NULL, 0xFF, NULL, fopAcM_GetRoomNo(this), NULL, NULL, NULL);
|
|
} else if (mpBckAnm->getFrame() == 17.0f) {
|
|
dComIfGp_getVibration().StartShock(4, 15, cXyz(0.0f, 1.0f, 0.0f));
|
|
} else if (mpBckAnm->getFrame() == 18.0f) {
|
|
mDoAud_seStart(Z2SE_OBJ_WOOD_DOOR_ROLLOPEN, &mSePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
}
|
|
|
|
if (rv != 0) {
|
|
dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
mDoAud_seStart(Z2SE_OBJ_WOOD_DOOR_OPEN_STOP, &mSePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::openProc_type2() {
|
|
static u16 const l_eff_id[5] = {
|
|
0x8762,
|
|
0x8763,
|
|
0x8764,
|
|
0x8765,
|
|
0x8766,
|
|
};
|
|
|
|
BOOL rv = mpBckAnm->play();
|
|
|
|
if (mpBckAnm->getFrame() == 1.0f) {
|
|
for (u32 i = 0; i < 5; i++) {
|
|
dComIfGp_particle_set(l_eff_id[i], ¤t.pos, &shape_angle, NULL, 0xFF, NULL, fopAcM_GetRoomNo(this), NULL, NULL, NULL);
|
|
}
|
|
} else if (mpBckAnm->getFrame() == 17.0f) {
|
|
dComIfGp_getVibration().StartShock(4, 15, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
|
|
if (mpBckAnm->getFrame() == 20.0f) {
|
|
fopAcM_seStart(this, Z2SE_OBJ_LV3_SHTR_UP_STOP, 0);
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::openProc_typeL3Boss() {
|
|
cLib_chaseF(&speedF, 30.0f, 4.0f);
|
|
return cLib_chaseF(&field_0x5fc, -450.0f, speedF) != 0 ? TRUE : FALSE;
|
|
}
|
|
|
|
void daObjKshtr_c::demoProc() {
|
|
static daObjKshtr_c::DemoFunc l_demoProc[2] = {
|
|
&daObjKshtr_c::demoJail1,
|
|
&daObjKshtr_c::demoJail2,
|
|
};
|
|
|
|
static daObjKshtr_c::DemoFunc l_demoProc2[2] = {
|
|
&daObjKshtr_c::demoJail11,
|
|
&daObjKshtr_c::demoJail21,
|
|
};
|
|
|
|
if (mIsCheckKey) {
|
|
(this->*l_demoProc[mType])();
|
|
} else {
|
|
(this->*l_demoProc2[mType])();
|
|
}
|
|
}
|
|
|
|
BOOL daObjKshtr_c::demoJail1() {
|
|
obj_keyhole_class* keyhole_p = (obj_keyhole_class*)fopAcM_SearchByID(mKeyHoleId);
|
|
|
|
switch (mDemoMode) {
|
|
case 0:
|
|
if (keyhole_p != NULL) {
|
|
keyhole_p->setOpen();
|
|
}
|
|
|
|
mDemoMode = 1;
|
|
dComIfGp_setItemKeyNumCount(-1);
|
|
fopAcM_seStart(this, Z2SE_OBJ_DOOR_CHAIN_LOCK_OPEN, 0);
|
|
break;
|
|
|
|
case 1:
|
|
if (keyhole_p != NULL && keyhole_p->checkOpenEnd()) {
|
|
mDemoMode = 2;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
anmInit();
|
|
mDoAud_seStart(Z2SE_OBJ_WOOD_DOOR_ROLLOPEN2, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
dComIfGp_getVibration().StartShock(4, 15, cXyz(0.0f, 1.0f, 0.0f));
|
|
offDzb();
|
|
mDemoMode = 3;
|
|
break;
|
|
|
|
case 3:
|
|
if (mpBckAnm->play()) {
|
|
dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
mDoAud_seStart(Z2SE_OBJ_WOOD_DOOR_OPEN_STOP, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
mDemoMode = 4;
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::demoJail2() {
|
|
obj_keyhole_class* keyhole_p = (obj_keyhole_class*)fopAcM_SearchByID(mKeyHoleId);
|
|
|
|
switch (mDemoMode) {
|
|
case 0:
|
|
if (keyhole_p != NULL) {
|
|
keyhole_p->setOpen();
|
|
}
|
|
|
|
mDemoMode = 1;
|
|
dComIfGp_setItemKeyNumCount(-1);
|
|
break;
|
|
|
|
case 1:
|
|
if (keyhole_p != NULL && keyhole_p->checkOpenEnd()) {
|
|
mDemoMode = 2;
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
speedF = 0.0f;
|
|
mDemoMode = 3;
|
|
anmInit();
|
|
break;
|
|
|
|
case 3:
|
|
if (mpBckAnm->play()) {
|
|
mDemoMode = 4;
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::demoJail11() {
|
|
switch (mDemoMode) {
|
|
case 0:
|
|
mDemoMode = 1;
|
|
anmInit();
|
|
mDoAud_seStart(Z2SE_OBJ_WOOD_DOOR_ROLLOPEN2, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
offDzb();
|
|
break;
|
|
|
|
case 1:
|
|
if (mpBckAnm->play()) {
|
|
mDemoMode = 2;
|
|
mDoAud_seStart(Z2SE_OBJ_WOOD_DOOR_OPEN_STOP, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
}
|
|
break;
|
|
|
|
case 2:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL daObjKshtr_c::demoJail21() {
|
|
return TRUE;
|
|
}
|
|
|
|
void daObjKshtr_c::anmInit() {
|
|
if (mpBckAnm != NULL) {
|
|
BOOL isWolf = FALSE;
|
|
if (daPy_py_c::checkNowWolf()) {
|
|
isWolf = TRUE;
|
|
}
|
|
|
|
J3DAnmTransform* anm = (J3DAnmTransform*)dComIfG_getObjectRes(l_anmArcName[mType], l_anmName[isWolf + mType * 2]);
|
|
|
|
JUT_ASSERT(1278, anm != NULL);
|
|
|
|
#if DEBUG
|
|
if (!mpBckAnm->init(anm, 1, 0, 1.0f, 0, -1, true)) {
|
|
JUT_ASSERT(1281, FALSE);
|
|
|
|
mpBckAnm->setPlaySpeed(1.0f);
|
|
}
|
|
#else
|
|
mpBckAnm->init(anm, 1, 0, 1.0f, 0, -1, true);
|
|
mpBckAnm->setPlaySpeed(1.0f);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void daObjKshtr_c::actionWaitEvent() {
|
|
if (eventInfo.checkCommandDoor()) {
|
|
setAction(1);
|
|
mDemoMode = 0;
|
|
fopAcM_onSwitch(this, mSwNo);
|
|
|
|
if (mType == TYPE_L3BOSS) {
|
|
dMeter2Info_onGameStatus(2);
|
|
}
|
|
} else if (checkOpen()) {
|
|
if (daPy_py_c::checkNowWolf()) {
|
|
mIsWolf = true;
|
|
} else {
|
|
mIsWolf = false;
|
|
}
|
|
|
|
eventInfo.setEventId(field_0x5f0[mIsWolf]);
|
|
eventInfo.setMapToolId(mEvId);
|
|
eventInfo.onCondition(dEvtCnd_CANDOOR_e);
|
|
}
|
|
}
|
|
|
|
void daObjKshtr_c::actionEvent() {
|
|
if (dComIfGp_evmng_endCheck(field_0x5f0[mIsWolf])) {
|
|
setAction(2);
|
|
dComIfGp_event_reset();
|
|
} else {
|
|
if (mType == TYPE_L3BOSS) {
|
|
dMeter2Info_onGameStatus(2);
|
|
}
|
|
|
|
demoProc2();
|
|
}
|
|
}
|
|
|
|
void daObjKshtr_c::actionDead() {
|
|
/* empty function */
|
|
}
|
|
|
|
void daObjKshtr_c::actionWaitEvent2() {
|
|
if (eventInfo.checkCommandDemoAccrpt()) {
|
|
setAction(1);
|
|
mDemoMode = 0;
|
|
} else if (fopAcM_isSwitch(this, mSwNo)) {
|
|
if (mType == TYPE_V_SHUTTER) {
|
|
openInit();
|
|
setAction(3);
|
|
} else {
|
|
fopAcM_orderOtherEventId(this, field_0x5f0[0], mEvId, 0xFFFF, 0, 1);
|
|
eventInfo.onCondition(dEvtCnd_CANDEMO_e);
|
|
}
|
|
}
|
|
}
|
|
|
|
void daObjKshtr_c::actionOpen() {
|
|
if (openProc()) {
|
|
setAction(2);
|
|
}
|
|
}
|
|
|
|
void daObjKshtr_c::actionEvent2() {
|
|
if (dComIfGp_evmng_endCheck(field_0x5f0[0])) {
|
|
setAction(2);
|
|
dComIfGp_event_reset();
|
|
} else {
|
|
demoProc();
|
|
}
|
|
}
|
|
|
|
void daObjKshtr_c::actionDead2() {
|
|
/* empty function */
|
|
}
|
|
|
|
int daObjKshtr_c::Draw() {
|
|
g_env_light.settingTevStruct(16, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
|
|
dComIfGd_setListBG();
|
|
|
|
if (mpBckAnm != NULL) {
|
|
mpBckAnm->entry(mpModel->getModelData());
|
|
}
|
|
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
mDoExt_bckAnmRemove(mpModel->getModelData());
|
|
dComIfGd_setList();
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daObjKshtr_c::Delete() {
|
|
dComIfG_resDelete(&mPhase1, l_arcName[mType]);
|
|
|
|
if (l_anmArcName[mType] != NULL) {
|
|
dComIfG_resDelete(&mPhase2, l_anmArcName[mType]);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int daObjKshtr_create1st(daObjKshtr_c* i_this) {
|
|
fopAcM_ct(i_this, daObjKshtr_c);
|
|
return i_this->create1st();
|
|
}
|
|
|
|
static int daObjKshtr_MoveBGDelete(daObjKshtr_c* i_this) {
|
|
return i_this->MoveBGDelete();
|
|
}
|
|
|
|
static int daObjKshtr_MoveBGExecute(daObjKshtr_c* i_this) {
|
|
return i_this->MoveBGExecute();
|
|
}
|
|
|
|
static int daObjKshtr_MoveBGDraw(daObjKshtr_c* i_this) {
|
|
return i_this->MoveBGDraw();
|
|
}
|
|
|
|
static actor_method_class daObjKshtr_METHODS = {
|
|
(process_method_func)daObjKshtr_create1st,
|
|
(process_method_func)daObjKshtr_MoveBGDelete,
|
|
(process_method_func)daObjKshtr_MoveBGExecute,
|
|
0,
|
|
(process_method_func)daObjKshtr_MoveBGDraw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_Obj_Kshutter = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
3, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Kshutter, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjKshtr_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
443, // mPriority
|
|
&daObjKshtr_METHODS, // sub_method
|
|
0x00040100, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|