mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-27 16:12:54 -04:00
850 lines
25 KiB
C++
850 lines
25 KiB
C++
//
|
|
// Generated by dtk
|
|
// Translation Unit: d_door.cpp
|
|
//
|
|
|
|
#include "d/dolzel.h" // IWYU pragma: keep
|
|
#include "d/d_door.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_vibration.h"
|
|
#include "d/res/res_key.h"
|
|
#include "d/res/res_hkyo.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "SSystem/SComponent/c_angle.h"
|
|
|
|
/* 8006B39C-8006B3A8 .text getSwbit__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getSwbit() {
|
|
return fopAcM_GetParam(this) & 0xFF;
|
|
}
|
|
|
|
/* 8006B3A8-8006B3B4 .text getSwbit2__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getSwbit2() {
|
|
return (fopAcM_GetParam(this) >> 0x14) & 0xFF;
|
|
}
|
|
|
|
/* 8006B3B4-8006B3C0 .text getType__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getType() {
|
|
return (fopAcM_GetParam(this) >> 0x08) & 0xF;
|
|
}
|
|
|
|
/* 8006B3C0-8006B3EC .text setType__12dDoor_info_cFUc */
|
|
void dDoor_info_c::setType(u8 type) {
|
|
if (type >= 0x10)
|
|
return;
|
|
fopAcM_SetParam(this, fopAcM_GetParam(this) & ~(0xF << 0x08));
|
|
fopAcM_SetParam(this, fopAcM_GetParam(this) | ((type << 0x08) & (0xFF << 0x08)));
|
|
}
|
|
|
|
/* 8006B3EC-8006B3F8 .text getEventNo__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getEventNo() {
|
|
return (fopAcM_GetParam(this) >> 0x0C) & 0xFF;
|
|
}
|
|
|
|
/* 8006B3F8-8006B404 .text getFRoomNo__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getFRoomNo() {
|
|
return home.angle.x & 0x3F;
|
|
}
|
|
|
|
/* 8006B404-8006B410 .text getBRoomNo__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getBRoomNo() {
|
|
return (home.angle.x >> 0x06) & 0x3F;
|
|
}
|
|
|
|
/* 8006B410-8006B41C .text getShipId__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getShipId() {
|
|
return home.angle.z & 0x3F;
|
|
}
|
|
|
|
/* 8006B41C-8006B428 .text getArg1__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getArg1() {
|
|
return (home.angle.z >> 0x08) & 0xFF;
|
|
}
|
|
|
|
/* 8006B428-8006B4C4 .text adjoinPlayer__12dDoor_info_cFv */
|
|
BOOL dDoor_info_c::adjoinPlayer() {
|
|
int frontRoomNo = getFRoomNo();
|
|
int backRoomNo = getBRoomNo();
|
|
if (frontRoomNo == 0x3F || backRoomNo == 0x3F)
|
|
return TRUE;
|
|
if (dComIfGp_roomControl_checkRoomDisp(frontRoomNo) ||
|
|
dComIfGp_roomControl_checkRoomDisp(backRoomNo))
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/* 8006B4C4-8006B554 .text getViewRoomNo__12dDoor_info_cFv */
|
|
u8 dDoor_info_c::getViewRoomNo() {
|
|
cXyz delta = dComIfGd_getView()->mLookat.mEye - current.pos;
|
|
if (delta.inprodXZ(mAngleVec) < 0.0f)
|
|
return getBRoomNo();
|
|
else
|
|
return getFRoomNo();
|
|
}
|
|
|
|
/* 8006B554-8006B5E4 .text frontCheckOld__12dDoor_info_cFv */
|
|
s32 dDoor_info_c::frontCheckOld() {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
cSGlobe globe(player->current.pos - current.pos);
|
|
cSAngle angle1;
|
|
angle1 = (globe.U() - current.angle.y);
|
|
s16 angle = angle1.Abs();
|
|
#if VERSION == VERSION_DEMO
|
|
if (angle < 0x4000)
|
|
#else
|
|
if (angle < 0x4000 && angle >= 0)
|
|
#endif
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
/* 8006B65C-8006B6F4 .text frontCheck__12dDoor_info_cFv */
|
|
s32 dDoor_info_c::frontCheck() {
|
|
s32 stayNo = dComIfGp_roomControl_getStayNo();
|
|
if (getFRoomNo() == getBRoomNo())
|
|
return frontCheckOld();
|
|
|
|
return stayNo == getFRoomNo() ? 0 :
|
|
stayNo == getBRoomNo() ? 1 : 2;
|
|
}
|
|
|
|
/* 8006B6F4-8006B824 .text drawCheck_local__12dDoor_info_cFv */
|
|
s32 dDoor_info_c::drawCheck_local() {
|
|
if (!adjoinPlayer() && eventInfo.checkCommandDemoAccrpt() == FALSE && eventInfo.checkCommandDoor() == FALSE)
|
|
return 0;
|
|
|
|
if (getFRoomNo() == 0x3F || getBRoomNo() == 0x3F)
|
|
tevStr.mRoomNo = dComIfGp_roomControl_getStayNo();
|
|
else
|
|
tevStr.mRoomNo = getViewRoomNo();
|
|
|
|
current.roomNo = tevStr.mRoomNo;
|
|
|
|
u8 front = frontCheck();
|
|
if (front == 2)
|
|
mRoomNo = -1;
|
|
else
|
|
mRoomNo = dComIfGp_roomControl_getStayNo();
|
|
|
|
if (!dComIfGp_roomControl_checkRoomDisp(tevStr.mRoomNo))
|
|
return 1;
|
|
|
|
if (getViewRoomNo() == 0x3F && (getFRoomNo() != 0x3F || getBRoomNo() != 0x3F))
|
|
return 1;
|
|
else
|
|
return 2;
|
|
}
|
|
|
|
/* 8006B824-8006B8AC .text drawCheck__12dDoor_info_cFi */
|
|
s32 dDoor_info_c::drawCheck(int mode) {
|
|
s32 rt = drawCheck_local();
|
|
if (rt != 0) {
|
|
if (mode) {
|
|
fopAcM_SetStatusMap(this, 0x0A);
|
|
} else {
|
|
fopAcM_SetStatusMap(this, 0x09);
|
|
}
|
|
} else {
|
|
fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e);
|
|
}
|
|
return rt == 2;
|
|
}
|
|
|
|
/* 8006B8AC-8006B954 .text checkExecute__12dDoor_info_cFv */
|
|
s32 dDoor_info_c::checkExecute() {
|
|
mFrontCheck = frontCheck();
|
|
if (fopAcM_CheckStatus(this, fopAcStts_UNK1000_e))
|
|
return 1;
|
|
|
|
if (eventInfo.checkCommandDemoAccrpt() || eventInfo.checkCommandDoor())
|
|
return 2;
|
|
|
|
if (mRoomNo2 != dComIfGp_roomControl_getStayNo())
|
|
return 0;
|
|
|
|
if (mFrontCheck != 2 && adjoinPlayer())
|
|
return 2;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 8006B954-8006BA30 .text startDemoProc__12dDoor_info_cFv */
|
|
void dDoor_info_c::startDemoProc() {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
mStaffId = dComIfGp_evmng_getMyStaffId("SHUTTER_DOOR");
|
|
shape_angle.y = current.angle.y;
|
|
JUT_ASSERT(DEMO_SELECT(271, 274), player);
|
|
s16 delta = player->home.angle.y - home.angle.y;
|
|
if (delta < 0)
|
|
delta = -delta;
|
|
if (delta < 0x1000 && delta > -1000)
|
|
shape_angle.y += 0x7FFF;
|
|
}
|
|
|
|
/* 8006BA30-8006BB5C .text makeEventId__12dDoor_info_cFi */
|
|
void dDoor_info_c::makeEventId(int spl) {
|
|
static const char* table[] = {
|
|
"DEFAULT_STOP_OPEN",
|
|
"DEFAULT_STOP_OPEN",
|
|
"DEFAULT_SHUTTER_DOOR_F",
|
|
"DEFAULT_SHUTTER_DOOR_F",
|
|
"DEFAULT_SHUTTER_DOOR_F_STOP",
|
|
"DEFAULT_SHUTTER_DOOR_F_STOP",
|
|
"DEFAULT_BS_SHUTTER_F",
|
|
"DEFAULT_KNOB_DOOR_F_OPEN",
|
|
"DEFAULT_KNOB_DOOR_B_OPEN",
|
|
"DEFAULT_KNOB_TALK",
|
|
"HKYO_DOOR",
|
|
"SHUTTER_DROP_CARRY",
|
|
};
|
|
|
|
for (s32 i = 0; i < 12; i++) {
|
|
mToolId[i] = dComIfGp_evmng_getToolId(getEventNo(), i);
|
|
mEventIdx[i] = dComIfGp_evmng_getEventIdx(table[i], mToolId[i]);
|
|
}
|
|
|
|
s16 r27;
|
|
switch (spl) {
|
|
case 1:
|
|
r27 = 2;
|
|
mEventIdx[r27] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_10", mToolId[r27]);
|
|
r27 = 3;
|
|
mEventIdx[r27] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_10", mToolId[r27]);
|
|
break;
|
|
case 2:
|
|
r27 = 2;
|
|
mEventIdx[r27] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_12", mToolId[r27]);
|
|
r27 = 3;
|
|
mEventIdx[r27] = dComIfGp_evmng_getEventIdx("DEFAULT_SHUTTER_DOOR_12", mToolId[r27]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 8006BB5C-8006BBB0 .text initProc__12dDoor_info_cFi */
|
|
void dDoor_info_c::initProc(int spl) {
|
|
mAngleVec.set(cM_ssin(home.angle.y), 0.0f, cM_scos(home.angle.y));
|
|
makeEventId(spl);
|
|
}
|
|
|
|
/* 8006BBB0-8006BC50 .text initOpenDemo__12dDoor_info_cFi */
|
|
void dDoor_info_c::initOpenDemo(int evt) {
|
|
if (m2C6 != 9)
|
|
dComIfGp_map_setAGBMapSendStopFlg();
|
|
|
|
shape_angle.y = current.angle.y;
|
|
if (mFrontCheck == 1)
|
|
shape_angle.y += 0x7FFF;
|
|
|
|
mStaffId = dComIfGp_evmng_getMyStaffId("SHUTTER_DOOR");
|
|
if (evt)
|
|
dComIfGp_event_onEventFlag(2);
|
|
}
|
|
|
|
/* 8006BC50-8006BDBC .text checkArea__12dDoor_info_cFfff */
|
|
BOOL dDoor_info_c::checkArea(f32 f1, f32 f2, f32 distXZSqMax) {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
cXyz delta = player->current.pos - current.pos;
|
|
f32 distXZSq = delta.abs2XZ();
|
|
if (distXZSq > distXZSqMax)
|
|
return FALSE;
|
|
|
|
delta.normalize();
|
|
f32 dot = delta.inprodXZ(mAngleVec);
|
|
f32 d3 = distXZSq * dot * dot;
|
|
if (d3 > f2)
|
|
return FALSE;
|
|
|
|
if (distXZSq - d3 > f1)
|
|
return FALSE;
|
|
|
|
s16 checkAngle = current.angle.y;
|
|
if (mFrontCheck == 1)
|
|
checkAngle += 0x7FFF;
|
|
if (abs((s16)(checkAngle - player->current.angle.y)) < 0x5000)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 8006BDBC-8006BE94 .text openInitCom__12dDoor_info_cFi */
|
|
void dDoor_info_c::openInitCom(int ship) {
|
|
if (mFrontCheck == 0) {
|
|
mFromRoomNo = getFRoomNo();
|
|
mToRoomNo = getBRoomNo();
|
|
} else {
|
|
mFromRoomNo = getBRoomNo();
|
|
mToRoomNo = getFRoomNo();
|
|
}
|
|
|
|
if (mFromRoomNo != mToRoomNo && mFromRoomNo != 0x3F && mToRoomNo != 0x3F)
|
|
dComIfGp_roomControl_offStatusFlag(mToRoomNo, 0x08);
|
|
|
|
if (ship && valShipId())
|
|
dStage_setShipPos(getShipId(), mToRoomNo);
|
|
}
|
|
|
|
/* 8006BE94-8006BF74 .text openProcCom__12dDoor_info_cFv */
|
|
void dDoor_info_c::openProcCom() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
s16 angle = shape_angle.y + 0x7FFF;
|
|
cXyz target;
|
|
cXyz playerPos = player->current.pos;
|
|
target = current.pos;
|
|
target.x += cM_ssin(angle) * -100.0f;
|
|
target.z += cM_scos(angle) * -100.0f;
|
|
playerPos.x = playerPos.x * 0.9f + target.x * 0.1f;
|
|
playerPos.z = playerPos.z * 0.9f + target.z * 0.1f;
|
|
player->setPlayerPosAndAngle(&playerPos, player->current.angle.y);
|
|
}
|
|
|
|
/* 8006BF74-8006C0A4 .text closeEndCom__12dDoor_info_cFv */
|
|
void dDoor_info_c::closeEndCom() {
|
|
if (mFromRoomNo != mToRoomNo && mFromRoomNo != 0x3F && mToRoomNo != 0x3F)
|
|
dComIfGp_roomControl_onStatusFlag(mFromRoomNo, 0x08);
|
|
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
cXyz delta = player->current.pos - current.pos;
|
|
f32 dot = delta.inprodXZ(mAngleVec);
|
|
f32 rad = dot < 0.0f ? 180.0f : -180.0f;
|
|
|
|
cXyz pos(current.pos.x - rad * mAngleVec.x, current.pos.y, current.pos.z - rad * mAngleVec.z);
|
|
s8 roomNo = fopAcM_GetRoomNo(player);
|
|
dComIfGs_setRestartRoom(
|
|
pos,
|
|
dot > 0.0f ? current.angle.y : (s16)(current.angle.y + 0x8000),
|
|
roomNo
|
|
);
|
|
}
|
|
|
|
/* 8006C0A4-8006C0EC .text getDemoAction__12dDoor_info_cFv */
|
|
s32 dDoor_info_c::getDemoAction() {
|
|
static char* action_table[] = {
|
|
"WAIT",
|
|
"STOP_OPEN",
|
|
"STOP_CLOSE",
|
|
"OPEN",
|
|
"CLOSE",
|
|
"SMOKE",
|
|
"SMOKE_END",
|
|
"SETGOAL",
|
|
"UNLOCK",
|
|
"SETSTART",
|
|
"SETANGLE",
|
|
"ADJUSTMENT",
|
|
"OPEN_PUSH",
|
|
"OPEN_PULL",
|
|
"OPEN_PUSH2",
|
|
"OPEN_PULL2",
|
|
"TALK",
|
|
"SETSTART_PUSH",
|
|
"SETSTART_PULL",
|
|
"END_CHECK",
|
|
"DROP_BF",
|
|
"DROP_AF",
|
|
};
|
|
|
|
return dComIfGp_evmng_getMyActIdx(mStaffId, action_table, ARRAY_SIZE(action_table), FALSE, 0);
|
|
}
|
|
|
|
/* 8006C0EC-8006C1D8 .text setGoal__12dDoor_info_cFv */
|
|
void dDoor_info_c::setGoal() {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
cXyz playerPos = player->current.pos;
|
|
cXyz target = current.pos;
|
|
s16 angle = shape_angle.y + 0x7FFF;
|
|
playerPos.x += cM_ssin(angle) * 350.0f;
|
|
playerPos.z += cM_scos(angle) * 350.0f;
|
|
target.x += cM_ssin(angle) * 250.0f;
|
|
target.z += cM_scos(angle) * 250.0f;
|
|
playerPos.x = playerPos.x * 0.8f + target.x * 0.2f;
|
|
playerPos.z = playerPos.z * 0.8f + target.z * 0.2f;
|
|
dComIfGp_evmng_setGoal(&playerPos);
|
|
}
|
|
|
|
/* 8006C1D8-8006C200 .text setPlayerAngle__12dDoor_info_cFi */
|
|
void dDoor_info_c::setPlayerAngle(BOOL flip) {
|
|
s16 angle = shape_angle.y;
|
|
daPy_py_c* link = (daPy_py_c*)dComIfGp_getLinkPlayer();
|
|
if (flip) {
|
|
angle += 0x7FFF;
|
|
}
|
|
link->changeDemoMoveAngle(angle);
|
|
}
|
|
|
|
/* 8006C200-8006C2BC .text setPosAndAngle__12dDoor_info_cFP4cXyzs */
|
|
void dDoor_info_c::setPosAndAngle(cXyz* pPos, s16 angle) {
|
|
if (eventInfo.checkCommandDemoAccrpt() || eventInfo.checkCommandDoor()) {
|
|
return;
|
|
}
|
|
if (pPos) {
|
|
attention_info.position = current.pos = *pPos;
|
|
attention_info.position.y += 150.0f;
|
|
eyePos = attention_info.position;
|
|
}
|
|
current.angle.y = angle;
|
|
shape_angle.y = current.angle.y;
|
|
mAngleVec.set(cM_ssin(current.angle.y), 0.0f, cM_scos(current.angle.y));
|
|
}
|
|
|
|
/* 8006C2BC-8006C388 .text smokeInit__13dDoor_smoke_cFP12dDoor_info_c */
|
|
void dDoor_smoke_c::smokeInit(dDoor_info_c* door) {
|
|
mPos = door->current.pos;
|
|
mRot.y = door->shape_angle.y;
|
|
JPABaseEmitter* emtr = dComIfGp_particle_set(dPa_name::ID_AK_JT_ELEMENTSMOKE00, &mPos, &mRot, NULL, 0xAA, &mSmokeCb, fopAcM_GetRoomNo(door));
|
|
m34 = 0;
|
|
m35 = 0;
|
|
if (emtr != NULL) {
|
|
emtr->setRate(16.0f);
|
|
emtr->setSpread(0.35f);
|
|
JGeometry::TVec3<f32> scale(2.0f, 2.0f, 2.0f);
|
|
emtr->setGlobalScale(scale);
|
|
}
|
|
}
|
|
|
|
/* 8006C388-8006C41C .text smokeProc__13dDoor_smoke_cFP12dDoor_info_c */
|
|
void dDoor_smoke_c::smokeProc(dDoor_info_c* door) {
|
|
if (m35 != 0) {
|
|
f32 wave = (m34 * 20) * ((m34 & 1) ? 1.0f : -1.0f);
|
|
m34++;
|
|
mPos.x += wave * door->mAngleVec.z;
|
|
mPos.z += wave * door->mAngleVec.x;
|
|
} else {
|
|
m35 = 1;
|
|
}
|
|
}
|
|
|
|
/* 8006C41C-8006C448 .text smokeEnd__13dDoor_smoke_cFv */
|
|
void dDoor_smoke_c::smokeEnd() {
|
|
mSmokeCb.remove();
|
|
}
|
|
|
|
/* 8006C448-8006C478 .text keyResLoad__12dDoor_key2_cFv */
|
|
cPhs_State dDoor_key2_c::keyResLoad() {
|
|
return dComIfG_resLoad(&mPhs, "Key");
|
|
}
|
|
|
|
/* 8006C478-8006C4A8 .text keyResDelete__12dDoor_key2_cFv */
|
|
void dDoor_key2_c::keyResDelete() {
|
|
dComIfG_resDelete(&mPhs, "Key");
|
|
}
|
|
|
|
/* 8006C4A8-8006C5E8 .text keyInit__12dDoor_key2_cFP12dDoor_info_c */
|
|
void dDoor_key2_c::keyInit(dDoor_info_c* door) {
|
|
if (mpModel != NULL && mbEnabled && !door->mFrontCheck) {
|
|
if ((int)door->getSwbit() < 0x80)
|
|
dComIfGs_onSwitch(door->getSwbit(), -1);
|
|
if (!mbIsBossDoor)
|
|
dComIfGp_setItemKeyNumCount(-1);
|
|
switch (mbIsBossDoor) {
|
|
case 1: fopAcM_seStart(door, JA_SE_OBJ_BOSS_LOCK_OPEN, 0); break;
|
|
default: fopAcM_seStart(door, JA_SE_OBJ_DOOR_CHAIN_OPEN, 0); break;
|
|
}
|
|
m20 = 1;
|
|
} else {
|
|
m20 = 0;
|
|
}
|
|
}
|
|
|
|
/* 8006C5E8-8006C650 .text keyProc__12dDoor_key2_cFv */
|
|
BOOL dDoor_key2_c::keyProc() {
|
|
if (m20) {
|
|
if (mBckAnim.play()) {
|
|
keyOff();
|
|
m20 = 0;
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
} else {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
/* 8006C650-8006C764 .text keyCreate_Nkey__12dDoor_key2_cFv */
|
|
BOOL dDoor_key2_c::keyCreate_Nkey() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Key", KEY_BDL_VLOCN);
|
|
JUT_ASSERT(DEMO_SELECT(713, 716), modelData != NULL);
|
|
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
|
|
if (mpModel == NULL)
|
|
return FALSE;
|
|
|
|
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("Key", KEY_BCK_VLOCN);
|
|
if (!mBckAnim.init(modelData, bck, TRUE, J3DFrameCtrl::EMode_NONE))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 8006C764-8006C910 .text keyCreate_Bkey__12dDoor_key2_cFv */
|
|
BOOL dDoor_key2_c::keyCreate_Bkey() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Key", KEY_BDL_VLOCB);
|
|
JUT_ASSERT(DEMO_SELECT(737, 740), modelData != NULL);
|
|
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
|
|
if (mpModel == NULL)
|
|
return FALSE;
|
|
|
|
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes("Key", KEY_BCK_VLOCB);
|
|
if (!mBckAnim.init(modelData, bck, TRUE, J3DFrameCtrl::EMode_NONE))
|
|
return FALSE;
|
|
|
|
J3DSkinDeform* deform = new J3DSkinDeform();
|
|
if (deform == NULL)
|
|
return FALSE;
|
|
|
|
switch (mpModel->setSkinDeform(deform, 1)) {
|
|
case J3DErrType_OutOfMemory:
|
|
return FALSE;
|
|
default:
|
|
JUT_ASSERT(DEMO_SELECT(771, 774), FALSE);
|
|
case J3DErrType_Success:
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
/* 8006C910-8006C948 .text keyCreate__12dDoor_key2_cFi */
|
|
BOOL dDoor_key2_c::keyCreate(int type) {
|
|
mbIsBossDoor = type;
|
|
switch (type) {
|
|
case 1: return keyCreate_Bkey();
|
|
default: return keyCreate_Nkey();
|
|
}
|
|
}
|
|
|
|
/* 8006C948-8006C954 .text keyOn__12dDoor_key2_cFv */
|
|
void dDoor_key2_c::keyOn() {
|
|
mbEnabled = true;
|
|
}
|
|
|
|
/* 8006C954-8006C960 .text keyOff__12dDoor_key2_cFv */
|
|
void dDoor_key2_c::keyOff() {
|
|
mbEnabled = false;
|
|
}
|
|
|
|
/* 8006C960-8006CA10 .text calcMtx__12dDoor_key2_cFP12dDoor_info_c */
|
|
void dDoor_key2_c::calcMtx(dDoor_info_c* door) {
|
|
if (mbEnabled) {
|
|
mDoMtx_stack_c::transS(door->current.pos);
|
|
mDoMtx_stack_c::YrotM(door->current.angle.y);
|
|
switch (mbIsBossDoor) {
|
|
case 1: mDoMtx_stack_c::transM(0.0f, 230.0f, 20.0f); break;
|
|
default: mDoMtx_stack_c::transM(0.0f, 150.0f, 20.0f); break;
|
|
}
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
|
|
/* 8006CA10-8006CA78 .text draw__12dDoor_key2_cFP12dDoor_info_c */
|
|
void dDoor_key2_c::draw(dDoor_info_c* door) {
|
|
J3DModelData* modelData = mpModel->getModelData();
|
|
g_env_light.setLightTevColorType(mpModel, &door->tevStr);
|
|
mBckAnim.entry(modelData);
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
}
|
|
|
|
/* 8006CA78-8006CB28 .text calcMtx__12dDoor_stop_cFP12dDoor_info_c */
|
|
void dDoor_stop_c::calcMtx(dDoor_info_c* door) {
|
|
if (m8 == 0 || mpModel == NULL)
|
|
return;
|
|
mDoMtx_stack_c::transS(door->current.pos.x, door->current.pos.y + mOffsY, door->current.pos.z);
|
|
mDoMtx_stack_c::YrotM(door->current.angle.y);
|
|
if (mFrontCheck == 1)
|
|
mDoMtx_stack_c::YrotM(0x7FFF);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 8006CB28-8006CBFC .text closeInit__12dDoor_stop_cFP12dDoor_info_c */
|
|
void dDoor_stop_c::closeInit(dDoor_info_c* door) {
|
|
mOffsY = 300.0f;
|
|
fopAcM_SetSpeedF(door, 0.0f);
|
|
if (door->getArg1() == 17) {
|
|
fopAcM_seStart(door, JA_SE_OBJ_CAGE_CLOSE, 0);
|
|
} else {
|
|
fopAcM_seStart(door, JA_SE_OBJ_STN_DOOR_STL_BAR, 0);
|
|
}
|
|
mB = 1;
|
|
}
|
|
|
|
/* 8006CBFC-8006CC80 .text closeProc__12dDoor_stop_cFP12dDoor_info_c */
|
|
s32 dDoor_stop_c::closeProc(dDoor_info_c* door) {
|
|
if (!mB)
|
|
return 1;
|
|
|
|
cLib_chaseF(&door->speedF, 60.0f, 6.0f);
|
|
if (cLib_chaseF(&mOffsY, 0.0f, door->speedF)) {
|
|
mB = FALSE;
|
|
return 2;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* 8006CC80-8006CD50 .text openInit__12dDoor_stop_cFP12dDoor_info_c */
|
|
void dDoor_stop_c::openInit(dDoor_info_c* door) {
|
|
mOffsY = 0.0f;
|
|
fopAcM_SetSpeedF(door, 0.0f);
|
|
if (door->getArg1() == 17) {
|
|
fopAcM_seStart(door, JA_SE_OBJ_CAGE_OPEN, 0);
|
|
} else {
|
|
fopAcM_seStart(door, JA_SE_OBJ_STN_DOOR_STL_BAR, 0);
|
|
}
|
|
mB = 1;
|
|
}
|
|
|
|
/* 8006CD50-8006CDD8 .text openProc__12dDoor_stop_cFP12dDoor_info_c */
|
|
s32 dDoor_stop_c::openProc(dDoor_info_c* door) {
|
|
if (!mB)
|
|
return 1;
|
|
|
|
cLib_chaseF(&door->speedF, 30.0f, 4.0f);
|
|
if (cLib_chaseF(&mOffsY, 300.0f, door->speedF)) {
|
|
mB = FALSE;
|
|
m8 = FALSE;
|
|
return 2;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/* 8006CDD8-8006CE8C .text create__12dDoor_stop_cFv */
|
|
BOOL dDoor_stop_c::create() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getStageRes("Stage", "stop10.bmd");
|
|
if (modelData == NULL)
|
|
modelData = (J3DModelData*)dComIfG_getStageRes("Stage", "stop10.bdl");
|
|
|
|
if (modelData != NULL) {
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203);
|
|
if (mpModel == NULL)
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 8006CE8C-8006CEA8 .text init__11dDoor_msg_cFs */
|
|
void dDoor_msg_c::init(s16 msg_id) {
|
|
mMsgId = msg_id;
|
|
mMsgPId = fpcM_ERROR_PROCESS_ID_e;
|
|
m_msg = NULL;
|
|
mState = 0;
|
|
}
|
|
|
|
/* 8006CEA8-8006D0DC .text proc__11dDoor_msg_cFP4cXyz */
|
|
BOOL dDoor_msg_c::proc(cXyz* pos) {
|
|
switch (mState) {
|
|
case 0:
|
|
mMsgPId = fopMsgM_messageSet(mMsgId, pos);
|
|
if (mMsgPId != fpcM_ERROR_PROCESS_ID_e)
|
|
mState++;
|
|
break;
|
|
case 1:
|
|
m_msg = fopMsgM_SearchByID(mMsgPId);
|
|
if (m_msg != NULL)
|
|
mState++;
|
|
break;
|
|
case 2:
|
|
JUT_ASSERT(DEMO_SELECT(951, 954), m_msg);
|
|
if (m_msg->mStatus == fopMsgStts_MSG_TYPING_e) {
|
|
switch (mMsgId) {
|
|
case 0x1BBD:
|
|
case 0x06A8:
|
|
dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f));
|
|
break;
|
|
}
|
|
mState++;
|
|
}
|
|
break;
|
|
case 3:
|
|
JUT_ASSERT(DEMO_SELECT(967, 970), m_msg);
|
|
if (m_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) {
|
|
switch (mMsgId) {
|
|
case 0x1BBD:
|
|
case 0x1BC0:
|
|
case 0x1BC1:
|
|
case 0x1BC2:
|
|
mMsgId++;
|
|
m_msg->mStatus = fopMsgStts_MSG_CONTINUES_e;
|
|
fopMsgM_messageSet(mMsgId);
|
|
break;
|
|
default:
|
|
mState++;
|
|
m_msg->mStatus = fopMsgStts_MSG_ENDS_e;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (m_msg != NULL && m_msg->mStatus == fopMsgStts_BOX_CLOSED_e) {
|
|
m_msg->mStatus = fopMsgStts_MSG_DESTROYED_e;
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/* 8006D0DC-8006D11C .text resLoad__12dDoor_hkyo_cFv */
|
|
cPhs_State dDoor_hkyo_c::resLoad() {
|
|
if (m11 == 0) {
|
|
return cPhs_COMPLEATE_e;
|
|
}
|
|
return dComIfG_resLoad(&mPhs, "Hkyo");
|
|
}
|
|
|
|
/* 8006D11C-8006D154 .text resDelete__12dDoor_hkyo_cFv */
|
|
void dDoor_hkyo_c::resDelete() {
|
|
if (m11 == 0) {
|
|
return;
|
|
}
|
|
dComIfG_resDelete(&mPhs, "Hkyo");
|
|
}
|
|
|
|
/* 8006D154-8006D2D4 .text create__12dDoor_hkyo_cFv */
|
|
BOOL dDoor_hkyo_c::create() {
|
|
if (m11 == 0)
|
|
return TRUE;
|
|
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Hkyo", HKYO_BDL_HKYO1);
|
|
JUT_ASSERT(DEMO_SELECT(1049, 1052), modelData != NULL);
|
|
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000202);
|
|
if (mpModel == NULL)
|
|
return FALSE;
|
|
|
|
mpBrkAnm = new mDoExt_brkAnm();
|
|
if (mpBrkAnm == NULL)
|
|
return FALSE;
|
|
|
|
J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Hkyo", HKYO_BRK_HKYO1B);
|
|
if (!mpBrkAnm->init(modelData, brk, TRUE, J3DFrameCtrl::EMode_LOOP))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 8006D2D4-8006D3A8 .text setAnm__12dDoor_hkyo_cFUc */
|
|
void dDoor_hkyo_c::setAnm(u8 idx) {
|
|
if (mAnmIdx == idx)
|
|
return;
|
|
|
|
mAnmIdx = idx;
|
|
if (idx == 0)
|
|
return;
|
|
|
|
u32 fileIndex;
|
|
switch (idx) {
|
|
case 1: fileIndex = HKYO_BRK_HKYO1A; break;
|
|
case 2: fileIndex = HKYO_BRK_HKYO1B; break;
|
|
default: fileIndex = HKYO_BRK_HKYO1C; break;
|
|
}
|
|
|
|
J3DModelData* modelData = mpModel->getModelData();
|
|
J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Hkyo", fileIndex);
|
|
mpBrkAnm->init(modelData, brk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, true, 0);
|
|
}
|
|
|
|
/* 8006D3A8-8006D3B4 .text init__12dDoor_hkyo_cFv */
|
|
void dDoor_hkyo_c::init() {
|
|
mAnmIdx = 0;
|
|
}
|
|
|
|
/* 8006D3B4-8006D464 .text calcMtx__12dDoor_hkyo_cFP12dDoor_info_cf */
|
|
void dDoor_hkyo_c::calcMtx(dDoor_info_c* door, f32 offsY) {
|
|
if (m11 == 0 || mpModel == NULL)
|
|
return;
|
|
mDoMtx_stack_c::transS(door->current.pos);
|
|
mDoMtx_stack_c::YrotM(door->current.angle.y);
|
|
mDoMtx_stack_c::transM(0.0f, offsY, 0.0f);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 8006D464-8006D500 .text draw__12dDoor_hkyo_cFP12dDoor_info_c */
|
|
void dDoor_hkyo_c::draw(dDoor_info_c* door) {
|
|
if (m11 == 0 || mAnmIdx == 0 || mpModel == NULL)
|
|
return;
|
|
if (!chkFirst()) {
|
|
J3DModelData* modelData = mpModel->getModelData();
|
|
g_env_light.setLightTevColorType(mpModel, &door->tevStr);
|
|
mpBrkAnm->entry(modelData);
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
}
|
|
}
|
|
|
|
/* 8006D500-8006D71C .text proc__12dDoor_hkyo_cFP12dDoor_info_c */
|
|
void dDoor_hkyo_c::proc(dDoor_info_c* door) {
|
|
if (m11 == 0 || mpModel == NULL)
|
|
return;
|
|
|
|
switch (m11) {
|
|
case 1:
|
|
if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0108))
|
|
setAnm(1);
|
|
else if (dComIfGs_isTmpBit(dSv_event_tmp_flag_c::UNK_0110))
|
|
setAnm(2);
|
|
else
|
|
setAnm(0);
|
|
break;
|
|
case 4:
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1710))
|
|
setAnm(0);
|
|
else
|
|
setAnm(3);
|
|
break;
|
|
case 3:
|
|
if (!dComIfGs_isTact(2) || dComIfGs_isEventBit(dSv_event_flag_c::UNK_1704))
|
|
setAnm(0);
|
|
else
|
|
setAnm(3);
|
|
break;
|
|
case 2:
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1704) || dComIfGs_isEventBit(dSv_event_flag_c::UNK_1B01))
|
|
setAnm(0);
|
|
else
|
|
setAnm(3);
|
|
break;
|
|
default:
|
|
setAnm(0);
|
|
break;
|
|
}
|
|
|
|
if (mAnmIdx != 0) {
|
|
mpBrkAnm->play();
|
|
fopAcM_seStart(door, JA_SE_OBJ_RES_DOOR_BLINK, 0);
|
|
}
|
|
}
|
|
|
|
/* 8006D71C-8006D784 .text chkFirst__12dDoor_hkyo_cFv */
|
|
BOOL dDoor_hkyo_c::chkFirst() {
|
|
if (m11 != 1)
|
|
return FALSE;
|
|
|
|
switch (mAnmIdx) {
|
|
case 1:
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::UNK_2602))
|
|
return TRUE;
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 8006D784-8006D7E8 .text onFirst__12dDoor_hkyo_cFv */
|
|
void dDoor_hkyo_c::onFirst() {
|
|
switch (mAnmIdx) {
|
|
case 1: dComIfGs_onEventBit(dSv_event_flag_c::UNK_2602); break;
|
|
case 2: dComIfGs_onEventBit(dSv_event_flag_c::UNK_2601); break;
|
|
}
|
|
}
|
|
|
|
/* 8006D7E8-8006D800 .text chkStart__12dDoor_hkyo_cFv */
|
|
BOOL dDoor_hkyo_c::chkStart() {
|
|
if (daPy_getPlayerActorClass()->getGrabUpEnd()) {
|
|
return TRUE;
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|