tp/src/d/actor/d_a_tbox.cpp

2009 lines
64 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Generated By: dol2asm
// Translation Unit: d_a_tbox
//
#include "d/actor/d_a_tbox.h"
#include "d/d_tresure.h"
#include "d/d_item_data.h"
#include "d/actor/d_a_midna.h"
#include "d/d_path.h"
#include "d/d_bg_w.h"
#include "SSystem/SComponent/c_math.h"
#include "Z2AudioLib/Z2Instances.h"
#include <cmath.h>
UNK_REL_DATA
UNK_BSS(1109)
UNK_BSS(1107)
UNK_BSS(1105)
UNK_BSS(1104)
UNK_BSS(1099)
UNK_BSS(1097)
UNK_BSS(1095)
UNK_BSS(1094)
UNK_BSS(1057)
UNK_BSS(1055)
UNK_BSS(1053)
UNK_BSS(1052)
UNK_BSS(1014)
UNK_BSS(1012)
UNK_BSS(1010)
UNK_BSS(1009)
/* 804961D4-804961EC 000000 0018+00 16/16 0/0 0/0 .rodata l_cull_size_box */
static const f32 l_cull_size_box[6] = { -150.0f, -10.0f, -150.0f, 150.0f, 300.0f, 100.0f };
/* 804961EC-80496228 000018 003C+00 1/2 0/0 0/0 .rodata l_cyl_info */
static const cM3dGCylS l_cyl_info[3] = {
{ 0.0f, 0.0f, -40.0f, 40.0f, 60.0f },
{ 0.0f, 0.0f, -60.0f, 50.0f, 70.0f },
{ 0.0f, 0.0f, -60.0f, 70.0f, 80.0f },
};
/* 804964B4-804964B8 -00001 0004+00 2/4 0/0 0/0 .data l_staff_name */
static char* l_staff_name = "TREASURE";
/* 804964B8-804964FC 000024 0044+00 1/1 0/0 0/0 .data l_cyl_src */
static dCcD_SrcCyl l_cyl_src = {
{
{0x0, {{0x0, 0x0, 0x1e}, {0x0, 0x0}, 0x79}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_METAL, 0x2, 0x0, 0x0, 0x3}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{0.0f, 0.0f, 0.0f}, // mCenter
0.0f, // mRadius
0.0f // mHeight
} // mCyl
};
/* 804964FC-80496550 -00001 0054+00 1/1 0/0 0/0 .data l_modelInfo */
static daTbox_ModelInfo l_modelInfo[3] = {
{ "Dalways", 12, 7, 25, 26, 14, 19 },
{ "Dalways", 13, 8, 27, 28, 14, 19 },
{ "BoxC", 14, 8, 20, 21, 11, 17 },
};
/* 804968E4-804968F0 000054 000C+00 2/3 0/0 0/0 .bss l_light_offset */
static cXyz l_light_offset(0.0f, 35.0f, 0.0f);
/* 80490D2C-80490DCC 0000EC 00A0+00 1/1 0/0 0/0 .text __ct__12daTbox_HIO_cFv */
daTbox_HIO_c::daTbox_HIO_c() {
mItemNo = 1;
mUseDebugItemNo = 0;
mGravity = -2.0f;
mDemoType = 0;
mTimerDisplay = 0;
mCheckDisplay = 0;
mClearSwitch = 0;
mSaveOff = 0;
mDebugLightColorEnabled = 0;
mLightColorR = 0;
mLightColorG = 0;
mLightColorB = 0;
mLightOffset = l_light_offset;
mLightPower = 70.0f;
mFluctuationRate = 0.3f;
mFluctuationSpeed = 7500;
mEnvColorInfluence = 0.55f;
mForPlacementCheck = 0;
}
/* 80490E50-80490E6C 000210 001C+00 6/6 0/0 0/0 .text getModelInfo__8daTbox_cFv */
daTbox_ModelInfo* daTbox_c::getModelInfo() {
return &l_modelInfo[getShapeType()];
}
/* 80496238-80496244 000064 000C+00 0/1 0/0 0/0 .rodata l_open_se_id */
static const u32 l_open_se_id[3] = { Z2SE_OBJ_TBOX_OPEN_A, Z2SE_OBJ_TBOX_OPEN_B, Z2SE_OBJ_TBOX_OPEN_C };
/* 80490E6C-80491170 00022C 0304+00 1/1 0/0 0/0 .text commonShapeSet__8daTbox_cFv */
cPhs__Step daTbox_c::commonShapeSet() {
daTbox_ModelInfo* model_info = getModelInfo();
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(model_info->mArcName, model_info->mModelResNo);
JUT_ASSERT(0x191, modelData != 0);
mpAnm = new mDoExt_bckAnm();
if (mpAnm == NULL) {
return cPhs_ERROR_e;
}
J3DAnmTransform* bck = (J3DAnmTransform*)dComIfG_getObjectRes(model_info->mArcName, model_info->mBckResNo);
if (!mpAnm->init(bck, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false)) {
return cPhs_ERROR_e;
}
mOpenSeId = l_open_se_id[getShapeType()];
u32 model_flag = 0x80000;
if (getShapeType() == SHAPE_BOSSKEY) {
model_flag = 0;
}
mpModel = mDoExt_J3DModel__create(modelData, model_flag, 0x11000084);
if (mpModel == NULL) {
return cPhs_ERROR_e;
}
if (!strcmp(dComIfGp_getStartStageName(), "D_MN01B")) { // Deku Toad chest
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Dalways", 15);
JUT_ASSERT(0x1BD, modelData != 0);
mpSlimeModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (mpSlimeModel == NULL) {
return cPhs_ERROR_e;
}
}
if (checkAppear()) {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(model_info->mArcName, model_info->mEffectResNo);
JUT_ASSERT(0x1CE, modelData != 0);
mpEffectModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (mpEffectModel == NULL) {
return cPhs_ERROR_e;
}
mpEffectAnm = new mDoExt_brkAnm();
if (mpEffectAnm == NULL) {
return cPhs_ERROR_e;
}
J3DAnmTevRegKey* brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(model_info->mArcName, model_info->mBrkResNo);
JUT_ASSERT(0x1E1, brk != 0);
if (!mpEffectAnm->init(modelData, brk, TRUE, J3DFrameCtrl::EMode_NONE, 0.0f, 0, -1)) {
return cPhs_ERROR_e;
}
}
mpModel->setBaseScale(scale);
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::YrotM(home.angle.y);
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
if (mpEffectModel != NULL) {
mpEffectModel->setBaseTRMtx(mDoMtx_stack_c::get());
}
mDoMtx_copy(mDoMtx_stack_c::get(), mBgMtx);
return cPhs_COMPLEATE_e;
}
/* 804911B8-804911C0 000578 0008+00 1/1 0/0 0/0 .text effectShapeSet__8daTbox_cFv */
cPhs__Step daTbox_c::effectShapeSet() {
return cPhs_COMPLEATE_e;
}
/* 804911C0-804911C8 000580 0008+00 1/1 0/0 0/0 .text envShapeSet__8daTbox_cFv */
cPhs__Step daTbox_c::envShapeSet() {
return cPhs_COMPLEATE_e;
}
/* 804911C8-8049129C 000588 00D4+00 1/1 0/0 0/0 .text bgCheckSet__8daTbox_cFv */
cPhs__Step daTbox_c::bgCheckSet() {
daTbox_ModelInfo* model_info = getModelInfo();
cBgD_t* bgd = (cBgD_t*)dComIfG_getObjectRes(model_info->mArcName, model_info->mOpenDzbResNo);
JUT_ASSERT(0x210, bgd != 0);
mpOpenBgW = new dBgW();
if (mpOpenBgW == NULL) {
return cPhs_ERROR_e;
}
if (mpOpenBgW->Set(bgd, 1, &mBgMtx) == 1) {
return cPhs_ERROR_e;
}
mpOpenBgW->SetCrrFunc(dBgS_MoveBGProc_TypicalRotY);
mpOpenBgW->Move();
mpBgCollision = NULL;
return cPhs_COMPLEATE_e;
}
/* 8049129C-804912EC 00065C 0050+00 1/1 0/0 0/0 .text lightReady__8daTbox_cFv */
void daTbox_c::lightReady() {
setLightPos();
mLight.mColor.r = 0;
mLight.mColor.g = 0;
mLight.mColor.b = 0;
mLight.mPow = 0.0f;
mLight.mFluctuation = 0.0f;
mAllcolRatio = 0.0f;
}
/* 804912EC-8049135C 0006AC 0070+00 2/2 0/0 0/0 .text setLightPos__8daTbox_cFv */
void daTbox_c::setLightPos() {
cXyz offset(l_light_offset);
cXyz pos;
cLib_offsetPos(&pos, &current.pos, current.angle.y, &offset);
mLight.mPosition.set(pos.x, pos.y, pos.z);
}
/* 8049135C-80491364 00071C 0008+00 2/2 0/0 0/0 .text checkEnv__8daTbox_cFv */
int daTbox_c::checkEnv() {
return true;
}
/* 80491364-8049139C 000724 0038+00 2/2 0/0 0/0 .text checkAppear__8daTbox_cFv */
int daTbox_c::checkAppear() {
if (getFuncType() == 2 || (getSwType() == 15 && getFuncType() == 1)) {
return true;
}
return false;
}
/* 8049139C-804913D0 00075C 0034+00 4/4 0/0 0/0 .text checkOpen__8daTbox_cFv */
int daTbox_c::checkOpen() {
return dComIfGs_isTbox(getTboxNo());
}
/* 804913D0-8049141C 000790 004C+00 3/3 0/0 0/0 .text clrDzb__8daTbox_cFv */
void daTbox_c::clrDzb() {
if (mpBgCollision != NULL) {
dComIfG_Bgsp().Release(mpBgCollision);
mpBgCollision = NULL;
}
}
/* 8049141C-80491484 0007DC 0068+00 6/6 0/0 0/0 .text setDzb__8daTbox_cFv */
void daTbox_c::setDzb() {
clrDzb();
if (checkOpen()) {
mpBgCollision = mpOpenBgW;
// "Opened Check Set\n"
OS_REPORT("開いたチェックセット\n");
} else {
mpBgCollision = mpBgW;
// "Closed Check Set\n"
OS_REPORT("閉じたチェックセット\n");
}
bool rt = dComIfG_Bgsp().Regist(mpBgCollision, this);
JUT_ASSERT(0x285, !rt);
}
/* 80491484-80491544 000844 00C0+00 1/1 0/0 0/0 .text surfaceProc__8daTbox_cFv */
void daTbox_c::surfaceProc() {
if (mpBgCollision != NULL && flagCheck(0x20)) {
if (field_0x750 < -1.0f) {
field_0x750 += 1.0f;
} else {
flagOff(0x20);
field_0x750 = 0.0f;
}
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + field_0x750, current.pos.z);
mDoMtx_stack_c::YrotM(home.angle.y);
MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
mpBgCollision->Move();
}
}
/* 80491544-804915BC 000904 0078+00 1/1 0/0 0/0 .text checkNormal__8daTbox_cFv */
int daTbox_c::checkNormal() {
int func_type = getFuncType();
if (func_type == 0 || func_type == 6 || func_type == 5 || func_type == 3) {
return true;
}
if (getSwNo() >= 0xC0) {
return false;
}
if (dComIfGs_isSwitch(getSwNo(), fopAcM_GetRoomNo(this))) {
return true;
} else {
return false;
}
}
/* 804915BC-80491624 00097C 0068+00 2/2 0/0 0/0 .text checkEnvEffectTbox__8daTbox_cFv */
int daTbox_c::checkEnvEffectTbox() {
if (getShapeType() == SHAPE_SMALL) {
return false;
}
if (getItemNo() == fpcNm_ITEM_BOOMERANG || getItemNo() == fpcNm_ITEM_MAP || getItemNo() == fpcNm_ITEM_COMPUS) {
return true;
}
if (getShapeType() == SHAPE_BOSSKEY) {
return true;
}
return dItem_data::chkFlag(getItemNo(), 0x40);
}
/* 80491624-804916A4 0009E4 0080+00 1/1 0/0 0/0 .text calcHeapSize__8daTbox_cFv */
u32 daTbox_c::calcHeapSize() {
int shape_type = getShapeType();
checkOpen();
checkAppear();
u32 heap_size = 0;
switch (shape_type) {
case SHAPE_SMALL:
heap_size = 0x1840;
break;
case SHAPE_LARGE:
heap_size = 0x2040;
break;
case SHAPE_BOSSKEY:
heap_size = 0x3060;
break;
}
return heap_size;
}
/* 804916A4-80491744 000A64 00A0+00 1/0 0/0 0/0 .text CreateHeap__8daTbox_cFv */
int daTbox_c::CreateHeap() {
cPhs__Step step = commonShapeSet();
if (step != cPhs_COMPLEATE_e) {
return false;
}
if (checkEnv()) {
step = envShapeSet();
if (step != cPhs_COMPLEATE_e) {
return false;
}
}
if (!checkOpen()) {
step = effectShapeSet();
if (step != cPhs_COMPLEATE_e) {
return false;
}
}
step = bgCheckSet();
if (step != cPhs_COMPLEATE_e) {
return false;
}
return true;
}
/* 80491744-804919B0 000B04 026C+00 1/1 0/0 0/0 .text CreateInit__8daTbox_cFv */
void daTbox_c::CreateInit() {
int func_type = getFuncType();
flagClr();
mpAnm->setPlaySpeed(0.0f);
initPos();
initAnm();
shape_angle.z = 0;
shape_angle.x = 0;
current.angle.z = 0;
current.angle.x = 0;
mStts.Init(0xff, 0xff, this);
mCyl.Set(l_cyl_src);
mCyl.SetStts(&mStts);
mCyl.cM3dGCyl::Set(l_cyl_info[getShapeType()]);
if (mpBgW != NULL) {
dComIfG_Bgsp().Release(mpBgW);
}
if (flagCheck(2)) {
clrDzb();
} else if (mpBgCollision == NULL) {
setDzb();
}
if (func_type == 5 || func_type == 6 || field_0x9cc == 1) {
mAcchCir.SetWall(500.0f, 0.0f);
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir,
fopAcM_GetSpeed_p(this), &current.angle, &shape_angle);
gravity = -2.0f;
field_0x97d = true;
field_0x97c = true;
} else if (func_type == 3) {
mAcchCir.SetWall(500.0f, 0.0f);
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir,
fopAcM_GetSpeed_p(this), NULL, NULL);
}
mTboxNo = getTboxNo();
mEventId = dComIfGp_getEventManager().getEventIdx(this, getEvent());
if (getShapeType() == SHAPE_BOSSKEY) {
eventInfo.setArchiveName(getModelInfo()->mArcName);
field_0x984 = dComIfGp_getEventManager().getEventIdx(this, "DEFAULT_TREASURE_BOSS", 0xff);
}
initBaseMtx();
lightReady();
mAllcolRatio = 1.0f;
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
fopAcM_setCullSizeBox(this, l_cull_size_box[0], l_cull_size_box[1], l_cull_size_box[2],
l_cull_size_box[3], l_cull_size_box[4], l_cull_size_box[5]);
}
/* 804919B0-80491BB0 000D70 0200+00 1/1 0/0 0/0 .text initPos__8daTbox_cFv */
void daTbox_c::initPos() {
int func_type = getFuncType();
if ((func_type == 6 && getSwType() == 15) || func_type == 7) {
dPath* path_p = dPath_GetRoomPath(getPathId(), -1);
JUT_ASSERT(0x3B7, path_p != 0);
if (func_type == 6 && path_p->m_num != 2 && path_p->m_num != 3) {
fopAcM_setWarningMessage(this, __FILE__, 0x3BD, "Num of Jump TBox's path point must be 2 or 3!");
}
if (dComIfGs_isSwitch(getSwNo(), fopAcM_GetRoomNo(this))) {
dStage_dPnt_c* pnt = &path_p->m_points[path_p->m_num - 1];
current.pos = pnt->m_position;
home.pos = pnt->m_position;
}
} else if (func_type == 6 && getSwType() == 0 && checkDrop()) {
cXyz pos;
if (!calcJumpGoalAndAngle(&pos, &current.angle.y)) {
// "Jump Treasure Chest: Failed to get Jump Goal!\n"
OS_REPORT_ERROR("ジャンプ宝箱:ジャンプ先の取得に失敗しました!\n");
}
current.pos = pos;
home.pos = pos;
getDropSAngle(&home.angle.y);
}
cXyz start = home.pos;
cXyz end = home.pos;
start.y += 5.0f;
end.y -= 30.0f;
bool line_check = fopAcM_lc_c::lineCheck(&start, &end, this);
if ((line_check && fopAcM_lc_c::checkMoveBG()) || (!line_check && func_type != 3)) {
// "Treasure Chest position initialization: No BG within 25cm, waiting for MoveBG!\n"
OS_REPORT("宝箱位置初期設定以内にが無いのでMoveBGを待ちます\n");
field_0x9cc = 1;
mMode = MODE_EXEC_WAIT;
} else {
// "Treasure Chest position initialization complete!\n"
OS_REPORT("宝箱位置初期設定完了!\n");
field_0x9cc = 0;
mMode = MODE_EXEC;
}
}
/* 80491BB0-80491F68 000F70 03B8+00 1/1 0/0 0/0 .text initAnm__8daTbox_cFv */
void daTbox_c::initAnm() {
int func_type = getFuncType();
if (checkOpen()) {
mpAnm->setFrame(mpAnm->getEndFrame());
if (func_type == 3) {
cXyz pos = current.pos;
if (fopAcM_gc_c::gndCheck(&pos)) {
current.pos.y = fopAcM_gc_c::getGroundY();
shape_angle.z = 0;
shape_angle.x = 0;
}
home.pos = current.pos;
attention_info.position = current.pos;
eyePos = current.pos;
}
setAction(&daTbox_c::actionWait);
int tbox_no = getTboxNo();
dTres_c::offStatus(0, tbox_no, 1);
} else if (!checkEnv()) {
setAction(&daTbox_c::actionOpenWait);
} else if (checkNormal()) {
if (func_type == 6 && !checkDrop()) {
setAction(&daTbox_c::actionDropWait);
} else if (func_type == 3) {
if (fopAcM_isSwitch(this, getSwNo())) {
cXyz pos = current.pos;
if (fopAcM_gc_c::gndCheck(&pos)) {
current.pos.y = fopAcM_gc_c::getGroundY();
shape_angle.z = 0;
shape_angle.x = 0;
}
home.pos = current.pos;
attention_info.position = current.pos;
eyePos = current.pos;
setAction(&daTbox_c::actionOpenWait);
} else {
setAction(&daTbox_c::actionDropWaitForWeb);
flagOn(2);
field_0x9fd = 1;
}
} else if (func_type == 0) {
setAction(&daTbox_c::actionOpenWait);
} else {
setAction(&daTbox_c::actionOpenWait);
}
int tbox_no = getTboxNo();
dTres_c::onStatus(0, tbox_no, 1);
} else {
int tbox_no = getTboxNo();
dTres_c::offStatus(0, tbox_no, 1);
switch (func_type) {
case 2:
setAction(&daTbox_c::actionGenocide);
mTimer = 65;
flagOn(3);
field_0x75a = 120;
break;
case 1:
if (getSwType() == 15) {
setAction(&daTbox_c::actionSwOnWait);
} else {
setAction(&daTbox_c::actionSwOnWait2);
}
field_0x75a = 120;
flagOn(3);
break;
}
}
}
/* 80491F68-804920A8 001328 0140+00 1/1 0/0 0/0 .text boxCheck__8daTbox_cFv */
int daTbox_c::boxCheck() {
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
if (!strcmp(dComIfGp_getStartStageName(), "R_SP01") && fopAcM_GetRoomNo(this) == 7 &&
player->getKandelaarFlamePos() == NULL) {
return false;
}
cXyz vec = player->attention_info.position - current.pos;
f32 dist2_xz = vec.abs2XZ();
f32 dist_y = fabsf(player->current.pos.y - current.pos.y);
if (dist2_xz < 22500.0f && fopAcM_seenPlayerAngleY(this) < 0x2000 &&
fopAcM_seenActorAngleY(player, this) < 0x2000 && dist_y < 20.0f) {
return true;
} else {
return false;
}
}
/* 804920A8-8049216C 001468 00C4+00 1/1 0/0 0/0 .text demoProcOpen__8daTbox_cFv */
void daTbox_c::demoProcOpen() {
if (mDemoFrame < 1000) {
mDemoFrame++;
}
if (mDemoFrame == 152) {
dKy_efplight_cut(&mLight);
} else if (mDemoFrame > 112) {
lightDownProc();
} else if (mDemoFrame > 2) {
lightUpProc();
}
if (mDemoFrame > 22) {
mLight.mPow = cM_ssin(mDemoFrame * 7500) * 21.0f + 70.0f;
}
lightColorProc();
environmentProc();
}
/* 8049216C-8049233C 00152C 01D0+00 1/1 0/0 0/0 .text lightColorProc__8daTbox_cFv */
// NONMATCHING - regalloc
void daTbox_c::lightColorProc() {
static int const key_frame[7] = {0x00, 0x07, 0x1e, 0x25, 0x2c, 0x5c, 0x8c};
static GXColorS10 const key_color[7] = {
{0x00, 0x00, 0x00, 0xff},
{0xff, 0xc3, 0x8a, 0xff},
{0xff, 0xc3, 0x8a, 0xff},
{0x37, 0x34, 0x24, 0xff},
{0xff, 0xc3, 0x8a, 0xff},
{0xff, 0xc3, 0x8a, 0xff},
{0x00, 0x00, 0x00, 0xff},
};
int var_r25, var_r24, var_r28, var_r30;
if (mDemoFrame < 140) {
for (var_r30 = 0; var_r30 < 7; var_r30++) {
if (key_frame[var_r30] <= mDemoFrame && key_frame[var_r30 + 1] > mDemoFrame) {
var_r25 = key_frame[var_r30];
var_r24 = key_frame[var_r30 + 1];
var_r28 = var_r30 + 1;
break;
}
}
int num_frames = var_r25 - var_r24;
s16 step_r = std::fabs<int>(key_color[var_r30 + 1].r - key_color[var_r30].r) / num_frames;
s16 step_g = std::fabs<int>(key_color[var_r30 + 1].g - key_color[var_r30].g) / num_frames;
s16 step_b = std::fabs<int>(key_color[var_r30 + 1].b - key_color[var_r30].b) / num_frames;
step_r++;
step_g++;
step_b++;
cLib_chaseS(&mLight.mColor.r, key_color[var_r28].r, step_r);
cLib_chaseS(&mLight.mColor.g, key_color[var_r28].g, step_g);
cLib_chaseS(&mLight.mColor.b, key_color[var_r28].b, step_b);
}
}
/* 8049233C-80492398 0016FC 005C+00 1/1 0/0 0/0 .text environmentProc__8daTbox_cFv */
void daTbox_c::environmentProc() {
if (mDemoFrame > 139) {
cLib_addCalc(&mAllcolRatio, 1.0f, 0.05f, 0.1f, 0.05f);
} else if (mDemoFrame > 169) {
mAllcolRatio = 1.0f;
}
}
/* 80492398-804923D4 001758 003C+00 1/1 0/0 0/0 .text lightUpProc__8daTbox_cFv */
void daTbox_c::lightUpProc() {
cLib_addCalc(&mLight.mPow, 70.0f, 0.05f, 5.0f, 1.0f);
}
/* 804923D4-80492408 001794 0034+00 1/1 0/0 0/0 .text lightDownProc__8daTbox_cFv */
void daTbox_c::lightDownProc() {
cLib_addCalc0(&mLight.mPow, 0.05f, 5.0f);
}
/* 80492408-80492450 0017C8 0048+00 2/2 0/0 0/0 .text dropProcInitCall__8daTbox_cFv */
void daTbox_c::dropProcInitCall() {
switch (getSwType()) {
case 0:
dropProcInit2();
break;
case 15:
dropProcInit();
break;
}
}
/* 80492450-804928DC 001810 048C+00 1/1 0/0 0/0 .text dropProcInit__8daTbox_cFv */
void daTbox_c::dropProcInit() {
dPath* path_p = dPath_GetRoomPath(getPathId(), -1);
JUT_ASSERT(0x56A, path_p != 0);
cXyz pos = current.pos;
cXyz pnt1 = path_p->m_points[1].m_position;
f32 var_f30;
if (path_p->m_num == 2) {
field_0x97c = false;
f32 delta_y = pos.y - pnt1.y;
f32 abs_gravity = std::fabsf(fopAcM_GetGravity(this));
var_f30 = JMAFastSqrt(2.0f * delta_y / abs_gravity);
speedF = pos.absXZ(pnt1) / var_f30;
setRotAxis(&pos, &pnt1);
} else if (path_p->m_num == 3) {
cXyz pnt2(path_p->m_points[2].m_position);
if (pos.y < pnt2.y) {
OS_REPORT_ERROR("落下開始点より落下点の方が上にあります!!!\n");
JUT_ASSERT(0x58F, 0);
}
f32 delta_y1 = pos.y - pnt2.y;
f32 delta_y2 = pnt1.y - pos.y;
f32 abs_gravity = fabsf(fopAcM_GetGravity(this));
f32 dist_xz = pos.absXZ(pnt2);
speedF = dist_xz * JMAFastSqrt(abs_gravity) /
(JMAFastSqrt(2.0f * delta_y2) + JMAFastSqrt(2.0f * (delta_y1 + delta_y2)));
speed.y = JMAFastSqrt(2.0f * abs_gravity * delta_y2);
setRotAxis(&pos, &pnt1);
var_f30 = JMAFastSqrt(2.0f / abs_gravity) *
(JMAFastSqrt(delta_y1) + JMAFastSqrt(delta_y1 + delta_y2));
}
field_0x9c8 = var_f30 / 19.0f;
}
/* 804928DC-80492B10 001C9C 0234+00 2/2 0/0 0/0 .text calcJumpGoalAndAngle__8daTbox_cFP4cXyzPs */
int daTbox_c::calcJumpGoalAndAngle(cXyz* i_pos, s16* i_angle) {
dPath* path_p = dPath_GetRoomPath(getPathId(), -1);
if (path_p != NULL) {
cXyz home_pos = home.pos;
cXyz vec2 = path_p->m_points[1].m_position;
f32 dist_xz = home_pos.absXZ(vec2);
s16 angle;
getDropSAngle(&angle);
cXyz goal(0.0f, 0.0f, dist_xz);
mDoMtx_stack_c::YrotS(angle);
mDoMtx_stack_c::multVec(&goal, &goal);
goal += home_pos;
goal.y = vec2.y;
*i_pos = goal;
*i_angle = angle;
return true;
}
return false;
}
/* 80492B10-80492BC8 001ED0 00B8+00 4/4 0/0 0/0 .text getDropSAngle__8daTbox_cFPs */
bool daTbox_c::getDropSAngle(s16* i_angle) {
if (getFuncType() == 6 && getSwType() == 0 && getDir() != 0) {
*i_angle = cM_deg2s((getDir() - 1) * 24 + 12);
return true;
}
return false;
}
/* 80492BC8-80492C84 001F88 00BC+00 1/1 0/0 0/0 .text getDir__8daTbox_cFv */
int daTbox_c::getDir() {
if (getSwType() == 15) {
if (dComIfGs_isSwitch(getSwNo(), fopAcM_GetRoomNo(this))) {
return 1;
} else {
return 0;
}
} else {
u16 bit = 1;
u16 dir = 0;
for (int i = 0; i < 4; i++) {
if (fopAcM_isSwitch(this, getSwNo() + i)) {
dir += bit;
}
bit = bit << 1;
}
return dir;
}
}
/* 80492C84-80492D08 002044 0084+00 2/2 0/0 0/0 .text setRotAxis__8daTbox_cFPC4cXyzPC4cXyz */
void daTbox_c::setRotAxis(cXyz const* i_pos, cXyz const* i_goalPos) {
mRotAxis = *i_goalPos - *i_pos;
mRotAxis.y = 0.0f;
mDoMtx_stack_c::YrotS(0x4000);
mDoMtx_stack_c::multVec(&mRotAxis, &mRotAxis);
}
/* 80492D08-80492F50 0020C8 0248+00 1/1 0/0 0/0 .text dropProcInit2__8daTbox_cFv */
void daTbox_c::dropProcInit2() {
cXyz goal_pos;
if (!calcJumpGoalAndAngle(&goal_pos, &current.angle.y)) {
// "Jump Treasure Chest: Failed to get jump goal!\n"
OSReport_Error("ジャンプ宝箱:ジャンプ先の取得に失敗しました!\n");
}
dPath* path_p = dPath_GetRoomPath(getPathId(), -1);
f32 temp;
if (path_p->m_num == 2) {
cXyz vec1 = current.pos;
cXyz vec2 = path_p->m_points[1].m_position;
field_0x97c = false;
f32 delta_y = vec1.y - vec2.y;
f32 abs_gravity = fabsf(fopAcM_GetGravity(this));
temp = JMAFastSqrt(2.0f * delta_y / abs_gravity);
speedF = vec1.absXZ(vec2) / temp;
setRotAxis(&vec1, &goal_pos);
} else {
// "Falling Memory Treasure Chest: There's not 2 points!\n"
OS_REPORT_ERROR("落下方向記憶宝箱:ポイントが2点ではありません!\n");
JUT_ASSERT(0x641, 0);
}
field_0x9c8 = temp / 19.0f;
}
/* 80492F50-804932C0 002310 0370+00 2/2 0/0 0/0 .text dropProc__8daTbox_cFv */
void daTbox_c::dropProc() {
if (field_0x9c8 != 0) {
s16 temp = field_0x9c6;
field_0x9c4 = 3400;
field_0x9c6 += field_0x9c4;
if (temp < 0 && field_0x9c6 > 0) {
field_0x9c8--;
}
} else if (field_0x9c8 == 0) {
field_0x9c4 = 0;
mDoMtx_identity(field_0x988);
}
if (mAcch.ChkGroundLanding() && field_0x97d) {
field_0x9c8 = 0;
field_0x9c4 = 0;
mDoMtx_identity(field_0x988);
speedF = 0.0f;
cXyz vec1(2.0f, 2.0f, 2.0f);
dComIfGp_particle_setPolyColor(0xe7, mAcch.m_gnd, &current.pos, &tevStr, &home.angle,
&vec1, 0, NULL, fopAcM_GetRoomNo(this), NULL);
dComIfGp_getVibration().StartShock(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f));
u32 sound_id = 0;
cXyz chkpos = current.pos;
chkpos.y += 10.0f;
dBgS_ObjGndChk gnd_chk;
gnd_chk.SetPos(&chkpos);
gnd_chk.SetActorPid(base.id);
dComIfG_Bgsp().GroundCross(&gnd_chk);
int bg_index = gnd_chk.GetBgIndex();
if (bg_index >= 0 && bg_index < 0x100) {
sound_id = dComIfG_Bgsp().GetMtrlSndId(gnd_chk);
}
mDoAud_seStart(JA_SE_OBJ_BLOCK_FALL_NORMAL, &eyePos, sound_id, dComIfGp_getReverb(home.roomNo));
}
if (home.pos.abs(current.pos) > 400.0f) {
field_0x97c = true;
field_0x97d = true;
}
}
/* 80493338-80493484 0026F8 014C+00 1/1 0/0 0/0 .text demoInitAppear__8daTbox_cFv */
void daTbox_c::demoInitAppear() {
mpEffectAnm->setFrame(0.0f);
mpEffectAnm->setPlaySpeed(1.0f);
cXyz particle_pos(current.pos.x, current.pos.y + 55.0f, current.pos.z);
csXyz particle_rot = home.angle;
static u16 const eff_id[6] = {0x8840, 0x8841, 0x8842, 0x8843, 0x8844, 0x8845};
for (u32 i = 0; i < 6; i++) {
dComIfGp_particle_set(eff_id[i], &particle_pos, &particle_rot, &scale, 0xff, NULL, -1, NULL, NULL, NULL);
}
flagOff(0x40);
flagOn(1);
fopAcM_seStart(this, Z2SE_OBJ_T_BOX_EMERGE, 0);
}
/* 80493484-80493518 002844 0094+00 1/1 0/0 0/0 .text demoProcAppear__8daTbox_cFv */
void daTbox_c::demoProcAppear() {
if (field_0x75a != 0) {
field_0x75a--;
}
if (mpEffectAnm->getFrame() == 110.0f) {
flagOff(1);
}
if (mpEffectAnm->play()) {
mpEffectAnm->setPlaySpeed(0.0f);
dComIfGp_evmng_cutEnd(mStaffId);
}
}
/* 80493518-80493838 0028D8 0320+00 7/7 0/0 0/0 .text demoProc__8daTbox_cFv */
int daTbox_c::demoProc() {
static char* action_table[] = {"WAIT", "OPEN", "APPEAR", "OPEN_SHORT", "DROP"};
int act_idx = dComIfGp_evmng_getMyActIdx(mStaffId, action_table, ARRAY_SIZE(action_table), 0, 0);
int tbox_no;
if (dComIfGp_evmng_getIsAddvance(mStaffId)) {
field_0x758 = false;
switch (act_idx) {
case 1:
OpenInit();
tbox_no = getTboxNo();
dTres_c::offStatus(0, tbox_no, 1);
break;
case 2:
flagOn(0x20);
field_0x750 = -130.0f;
setDzb();
flagOff(2);
tbox_no = getTboxNo();
dTres_c::onStatus(0, tbox_no, 1);
demoInitAppear();
break;
case 3:
OpenInit_com();
tbox_no = getTboxNo();
dTres_c::offStatus(0, tbox_no, 1);
break;
case 4:
field_0x9ca = 7;
}
}
switch (act_idx) {
case 2:
demoProcAppear();
surfaceProc();
break;
case 1:
if (field_0x758) {
dComIfGp_evmng_cutEnd(mStaffId);
} else {
if (field_0x97e != 0) {
mpAnm->setFrame(daPy_getPlayerActorClass()->getBaseAnimeFrame());
}
mpAnm->play();
if (mpAnm->getFrameCtrl()->checkState(1)) {
field_0x758 = true;
dComIfGp_evmng_cutEnd(mStaffId);
}
}
field_0x97e++;
break;
case 3:
if (field_0x758) {
dComIfGp_evmng_cutEnd(mStaffId);
} else {
if (field_0x97e != 0) {
mpAnm->setFrame(daPy_getPlayerActorClass()->getBaseAnimeFrame());
}
mpAnm->play();
if (mpAnm->getFrameCtrl()->checkState(1)) {
field_0x758 = true;
dComIfGp_evmng_cutEnd(mStaffId);
}
}
field_0x97e++;
break;
case 4:
if (field_0x9ca > -2) {
field_0x9ca--;
}
if (field_0x9ca == 0) {
dropProcInitCall();
} else if (field_0x9ca < 0) {
dropProc();
if (mAcch.ChkGroundHit() && field_0x97d) {
dComIfGp_evmng_cutEnd(mStaffId);
}
}
break;
default:
dComIfGp_evmng_cutEnd(mStaffId);
break;
}
if (flagCheck(0x10)) {
demoProcOpen();
}
if (flagCheck(8)) {
dKy_set_allcol_ratio(mAllcolRatio);
}
return false;
}
/* 80493838-804939A4 002BF8 016C+00 2/2 0/0 0/0 .text OpenInit_com__8daTbox_cFv */
void daTbox_c::OpenInit_com() {
field_0x97e = 0;
if (!field_0x718) {
dComIfGs_onTbox(getTboxNo());
setDzb();
if (mpBgCollision != NULL) {
mpBgCollision->Move();
}
}
if (checkEnvEffectTbox()) {
mAllcolRatio = 0.55f;
dKy_set_allcol_ratio(mAllcolRatio);
flagOn(8);
dKy_efplight_set(&mLight);
if (getShapeType() == SHAPE_LARGE) {
J3DAnmTransform* bck =
(J3DAnmTransform*)dComIfG_getObjectRes(getModelInfo()->mArcName, 9);
mpAnm->init(bck, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, bck->getFrameMax(), true);
mOpenSeId = Z2SE_OBJ_TBOX_OPEN_B_SLOW;
}
}
mpAnm->setPlaySpeed(0.0f);
fopAcM_seStart(this, mOpenSeId, 0);
}
/* 804939A4-804939F4 002D64 0050+00 1/1 0/0 0/0 .text OpenInit__8daTbox_cFv */
void daTbox_c::OpenInit() {
OpenInit_com();
field_0x759 = 1;
mDemoFrame = 0;
flagOn(0x10);
setLightPos();
}
/* 804939F4-804939FC 002DB4 0008+00 2/0 0/0 0/0 .text actionWait__8daTbox_cFv */
int daTbox_c::actionWait() {
return true;
}
/* 804939FC-80493CC8 002DBC 02CC+00 1/0 0/0 0/0 .text actionDemo__8daTbox_cFv */
int daTbox_c::actionDemo() {
if (dComIfGp_evmng_endCheck(eventInfo.getEventId())) {
if (field_0x718) {
mpAnm->setPlaySpeed(0.0f);
mpAnm->setFrame(0.0f);
setAction(&daTbox_c::actionOpenWait);
} else {
setAction(&daTbox_c::actionWait);
}
dComIfGp_event_reset();
dKy_set_allcol_ratio(1.0f);
flagOff(0x18);
dComIfGp_event_setItemPartner(NULL);
if (getItemNo() == fpcNm_ITEM_KAKERA_HEART) {
if (!strcmp(dComIfGp_getStartStageName(), "F_SP121")) {
if (fopAcM_GetRoomNo(this) == 0) {
switch (getTboxNo()) {
case 3:
dComIfGs_setEventReg(0xedff, dComIfGs_getEventReg(0xedff) | 0x40);
break;
case 2:
dComIfGs_setEventReg(0xebff, dComIfGs_getEventReg(0xebff) | 0x10);
break;
default:
// "Piece of Heart: Unexpected configuration. Couldn't set Event Bit!\n"
OSReport_Error("ハートの欠片:想定外の配置です。イベントビットセットできませんでした!\n");
break;
}
} else if (fopAcM_GetRoomNo(this) == 3) {
switch (getTboxNo()) {
case 5:
dComIfGs_setEventReg(0xf0ff, dComIfGs_getEventReg(0xf0ff) | 0x80);
break;
default:
// "Piece of Heart: Unexpected configuration. Couldn't set Event Bit!\n"
OSReport_Error("ハートの欠片:想定外の配置です。イベントビットセットできませんでした!\n");
break;
}
}
} else if (!strcmp(dComIfGp_getStartStageName(), "F_SP109")) {
if (fopAcM_GetRoomNo(this) == 0 && getTboxNo() == 21) {
dComIfGs_setEventReg(0xefff, dComIfGs_getEventReg(0xefff) | 0x10);
}
}
}
} else {
demoProc();
}
field_0x9f4++;
return true;
}
/* 80493CC8-80493D90 003088 00C8+00 2/0 0/0 0/0 .text actionDemo2__8daTbox_cFv */
int daTbox_c::actionDemo2() {
if ((getEvent() == 0xFF && dComIfGp_evmng_endCheck("DEFAULT_TREASURE_APPEAR")) ||
(getEvent() != 0xFF && dComIfGp_evmng_endCheck(mEventId))) {
setAction(&daTbox_c::actionOpenWait);
dComIfGp_event_reset();
} else {
demoProc();
}
return true;
}
/* 80493D90-80493ED8 003150 0148+00 2/0 0/0 0/0 .text actionDropDemo__8daTbox_cFv */
int daTbox_c::actionDropDemo() {
if (mEventId != -1) {
if (dComIfGp_evmng_endCheck(mEventId)) {
setAction(&daTbox_c::actionOpenWait);
dComIfGp_event_reset();
setDzb();
home.pos = current.pos;
if (field_0x9c9 != 0) {
camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
camera->mCamera.Start();
camera->mCamera.SetTrimSize(0);
field_0x9c9 = 0;
}
} else {
demoProc();
}
} else {
dropProc();
if (mAcch.ChkGroundLanding() && field_0x97d) {
setAction(&daTbox_c::actionOpenWait);
home.pos = current.pos;
}
}
return true;
}
/* 80493ED8-80493FE8 003298 0110+00 5/3 0/0 0/0 .text getBombItemNo__8daTbox_cFUcUc */
u8 daTbox_c::getBombItemNo(u8 i_bombType, u8 i_itemNo) {
u8 new_item_no = i_itemNo;
switch (i_bombType) {
case fpcNm_ITEM_NORMAL_BOMB:
switch (i_itemNo) {
case fpcNm_ITEM_WATER_BOMB_5:
case fpcNm_ITEM_WATER_BOMB_30:
case fpcNm_ITEM_BOMB_INSECT_5:
case fpcNm_ITEM_BOMB_INSECT_20:
new_item_no = fpcNm_ITEM_BOMB_5;
break;
case fpcNm_ITEM_WATER_BOMB_10:
case fpcNm_ITEM_BOMB_INSECT_10:
new_item_no = fpcNm_ITEM_BOMB_10;
break;
case fpcNm_ITEM_WATER_BOMB_20:
new_item_no = fpcNm_ITEM_BOMB_20;
break;
case fpcNm_ITEM_BOMB_INSECT_30:
new_item_no = fpcNm_ITEM_BOMB_30;
break;
}
break;
case fpcNm_ITEM_WATER_BOMB:
switch (i_itemNo) {
case fpcNm_ITEM_BOMB_INSECT_20:
case fpcNm_ITEM_BOMB_INSECT_30:
new_item_no = fpcNm_ITEM_WATER_BOMB_30;
break;
case fpcNm_ITEM_BOMB_5:
case fpcNm_ITEM_BOMB_INSECT_5:
new_item_no = fpcNm_ITEM_WATER_BOMB_5;
break;
case fpcNm_ITEM_BOMB_10:
case fpcNm_ITEM_BOMB_INSECT_10:
new_item_no = fpcNm_ITEM_WATER_BOMB_10;
break;
case fpcNm_ITEM_BOMB_20:
case fpcNm_ITEM_BOMB_30:
new_item_no = fpcNm_ITEM_WATER_BOMB_20;
break;
}
break;
case fpcNm_ITEM_POKE_BOMB:
switch (i_itemNo) {
case fpcNm_ITEM_WATER_BOMB_30:
new_item_no = fpcNm_ITEM_BOMB_INSECT_20;
break;
case fpcNm_ITEM_BOMB_5:
case fpcNm_ITEM_WATER_BOMB_5:
new_item_no = fpcNm_ITEM_BOMB_INSECT_5;
break;
case fpcNm_ITEM_BOMB_10:
case fpcNm_ITEM_BOMB_20:
case fpcNm_ITEM_BOMB_30:
case fpcNm_ITEM_WATER_BOMB_10:
case fpcNm_ITEM_WATER_BOMB_20:
new_item_no = fpcNm_ITEM_BOMB_INSECT_10;
break;
}
break;
case fpcNm_ITEM_BOMB_BAG_LV1:
break;
}
// "Bomb Check\n"
OS_REPORT("\x1b[43;30m爆弾チェック\n");
if (i_itemNo == new_item_no) {
// "Get bomb %d as is\n"
OS_REPORT("爆弾 %d をそのままゲットします\n\x1b[m", new_item_no);
} else {
// "Bomb %d replaced by %d\n"
OS_REPORT("爆弾 %d を %d に差し替えました\n\x1b[m", i_itemNo, new_item_no);
}
return new_item_no;
}
/* 80493FE8-80494144 0033A8 015C+00 1/1 0/0 0/0 .text getBombItemNo2__8daTbox_cFUcUcUc */
u8 daTbox_c::getBombItemNo2(u8 i_bombType1, u8 i_bombType2, u8 i_itemNo) {
u8 new_type, new_item_no = i_itemNo;
switch (i_itemNo) {
case fpcNm_ITEM_BOMB_5:
case fpcNm_ITEM_BOMB_10:
case fpcNm_ITEM_BOMB_20:
case fpcNm_ITEM_BOMB_30:
new_type = fpcNm_ITEM_NORMAL_BOMB;
break;
case fpcNm_ITEM_WATER_BOMB_5:
case fpcNm_ITEM_WATER_BOMB_10:
case fpcNm_ITEM_WATER_BOMB_20:
case fpcNm_ITEM_WATER_BOMB_30:
new_type = fpcNm_ITEM_WATER_BOMB;
break;
case fpcNm_ITEM_BOMB_INSECT_5:
case fpcNm_ITEM_BOMB_INSECT_10:
case fpcNm_ITEM_BOMB_INSECT_20:
case fpcNm_ITEM_BOMB_INSECT_30:
new_type = fpcNm_ITEM_POKE_BOMB;
break;
}
// "Bomb Check - 2 Bags\n"
OS_REPORT("\x1b[43;30m爆弾チェック・袋\n");
// "Bomb Type is %d\n"
OS_REPORT("爆弾の種別は %d です\n", new_type);
if (i_bombType1 == new_type || i_bombType2 == new_type) {
// "There's a bag with the same bomb in it\n"
OS_REPORT("同じ爆弾入りの袋があるのでそこに入れます\n");
} else if (i_bombType1 == fpcNm_ITEM_BOMB_BAG_LV1 || i_bombType2 == fpcNm_ITEM_BOMB_BAG_LV1) {
// "This is an empty bag so put it in\n"
OS_REPORT("空の袋があるのでそこに入れます\n");
} else {
switch (new_type) {
case fpcNm_ITEM_NORMAL_BOMB:
if (i_bombType1 == fpcNm_ITEM_WATER_BOMB || i_bombType2 == fpcNm_ITEM_WATER_BOMB) {
new_item_no = getBombItemNo(fpcNm_ITEM_WATER_BOMB, i_itemNo);
} else {
new_item_no = getBombItemNo(fpcNm_ITEM_POKE_BOMB, i_itemNo);
}
break;
case fpcNm_ITEM_WATER_BOMB:
if (i_bombType1 == fpcNm_ITEM_NORMAL_BOMB || i_bombType2 == fpcNm_ITEM_NORMAL_BOMB) {
new_item_no = getBombItemNo(fpcNm_ITEM_NORMAL_BOMB, i_itemNo);
} else {
new_item_no = getBombItemNo(fpcNm_ITEM_POKE_BOMB, i_itemNo);
}
break;
case fpcNm_ITEM_POKE_BOMB:
if (i_bombType1 == fpcNm_ITEM_NORMAL_BOMB || i_bombType2 == fpcNm_ITEM_NORMAL_BOMB) {
new_item_no = getBombItemNo(fpcNm_ITEM_NORMAL_BOMB, i_itemNo);
} else {
new_item_no = getBombItemNo(fpcNm_ITEM_WATER_BOMB, i_itemNo);
}
break;
}
}
OS_REPORT("\x1b[m\n");
return new_item_no;
}
/* 80494144-804942CC 003504 0188+00 1/1 0/0 0/0 .text getBombItemNo3__8daTbox_cFUcUcUcUc
*/
u8 daTbox_c::getBombItemNo3(u8 i_bombType1, u8 i_bombType2, u8 i_bombType3, u8 i_itemNo) {
u8 new_type, new_item_no = i_itemNo;
switch (i_itemNo) {
case fpcNm_ITEM_BOMB_5:
case fpcNm_ITEM_BOMB_10:
case fpcNm_ITEM_BOMB_20:
case fpcNm_ITEM_BOMB_30:
new_type = fpcNm_ITEM_NORMAL_BOMB;
break;
case fpcNm_ITEM_WATER_BOMB_5:
case fpcNm_ITEM_WATER_BOMB_10:
case fpcNm_ITEM_WATER_BOMB_20:
case fpcNm_ITEM_WATER_BOMB_30:
new_type = fpcNm_ITEM_WATER_BOMB;
break;
case fpcNm_ITEM_BOMB_INSECT_5:
case fpcNm_ITEM_BOMB_INSECT_10:
case fpcNm_ITEM_BOMB_INSECT_20:
case fpcNm_ITEM_BOMB_INSECT_30:
new_type = fpcNm_ITEM_POKE_BOMB;
break;
}
// "Bomb Check - 3 Bags\n"
OS_REPORT("\x1b[43;30m爆弾チェック・袋\n");
// "Bomb Type is %d\n"
OS_REPORT("爆弾の種別は %d です\n", new_type);
if (i_bombType1 == new_type || i_bombType2 == new_type || i_bombType3 == new_type) {
// "There's a bag with the same bomb in it\n"
OS_REPORT("同じ爆弾入りの袋があるのでそこに入れます\n");
} else if (i_bombType1 == fpcNm_ITEM_BOMB_BAG_LV1 || i_bombType2 == fpcNm_ITEM_BOMB_BAG_LV1 || i_bombType3 == fpcNm_ITEM_BOMB_BAG_LV1) {
// "This is an empty bag so put it in\n"
OS_REPORT("空の袋があるのでそこに入れます\n");
} else {
switch (new_type) {
case fpcNm_ITEM_NORMAL_BOMB:
if (i_bombType1 == fpcNm_ITEM_WATER_BOMB || i_bombType2 == fpcNm_ITEM_WATER_BOMB || i_bombType3 == fpcNm_ITEM_WATER_BOMB) {
new_item_no = getBombItemNo(fpcNm_ITEM_WATER_BOMB, i_itemNo);
} else {
new_item_no = getBombItemNo(fpcNm_ITEM_POKE_BOMB, i_itemNo);
}
break;
case fpcNm_ITEM_WATER_BOMB:
if (i_bombType1 == fpcNm_ITEM_NORMAL_BOMB || i_bombType2 == fpcNm_ITEM_NORMAL_BOMB || i_bombType3 == fpcNm_ITEM_NORMAL_BOMB) {
new_item_no = getBombItemNo(fpcNm_ITEM_NORMAL_BOMB, i_itemNo);
} else {
new_item_no = getBombItemNo(fpcNm_ITEM_POKE_BOMB, i_itemNo);
}
break;
case fpcNm_ITEM_POKE_BOMB:
if (i_bombType1 == fpcNm_ITEM_NORMAL_BOMB || i_bombType2 == fpcNm_ITEM_NORMAL_BOMB || i_bombType3 == fpcNm_ITEM_NORMAL_BOMB) {
new_item_no = getBombItemNo(fpcNm_ITEM_NORMAL_BOMB, i_itemNo);
} else {
new_item_no = getBombItemNo(fpcNm_ITEM_WATER_BOMB, i_itemNo);
}
break;
}
}
OS_REPORT("\x1b[m\n");
return new_item_no;
}
/* 804942CC-804945C8 00368C 02FC+00 1/1 0/0 0/0 .text getBombItemNoMain__8daTbox_cFUc */
u8 daTbox_c::getBombItemNoMain(u8 i_itemNo) {
u8 bomb_type[3], bomb_max[3], bomb_num[3];
u8 bag_count = 0;
for (int i = 0; i < 3; i++) {
bomb_type[i] = dComIfGs_getItem(SLOT_15 + i, false);
bomb_max[i] = dComIfGs_getBombMax(bomb_type[i]);
bomb_num[i] = dComIfGs_getBombNum(i);
if (bomb_type[i] != fpcNm_ITEM_NONE) {
bag_count++;
}
}
#ifdef DEBUG
// "====Bomb Bag count is %d====\n"
OS_REPORT("====バクダン袋の数は %d 個です====\n", bag_count);
for (int i = 0; i < 3; i++) {
// "Bomb Bag<%d> : Type <%d> Max <%d> Current <%d>\n"
OS_REPORT("爆弾袋<%d> : 種別 <%d> 最大 <%d> 現在 <%d>\n", i, bomb_type[i], bomb_max[i], dComIfGs_getBombNum(i));
}
OS_REPORT("==================================\n");
#endif
switch (bag_count) {
case 0:
break;
case 1:
i_itemNo = getBombItemNo(bomb_type[0], i_itemNo);
break;
case 2:
if (bomb_num[0] == bomb_max[0] && bomb_max[0] != 0) {
if (bomb_num[1] == bomb_max[1] && bomb_max[1] != 0) {
// "Both Bomb Bags are full!\n"
OS_REPORT("\x1b[43;30mバクダン袋つ共一杯でした\n\x1b[m");
} else {
// "Bag 2 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo(bomb_type[1], i_itemNo);
}
} else if (bomb_num[1] == bomb_max[1] && bomb_max[1] != 0) {
// "Bag 1 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo(bomb_type[0], i_itemNo);
} else {
// "Bag 1 and 2 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo2(bomb_type[0], bomb_type[1], i_itemNo);
}
break;
case 3:
if (bomb_num[0] == bomb_max[0] && bomb_max[0] != 0) {
if (bomb_num[1] == bomb_max[1] && bomb_max[1] != 0) {
if (bomb_num[2] == bomb_max[2] && bomb_max[2] != 0) {
// "All 3 Bomb Bags are full!\n"
OS_REPORT("\x1b[43;30mバクダン袋つ共一杯でした\n\x1b[m");
} else {
// "Bag 3 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo(bomb_type[2], i_itemNo);
}
} else if (bomb_num[2] == bomb_max[2] && bomb_max[2] != 0) {
// "Bag 2 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo(bomb_type[1], i_itemNo);
} else {
// "Bag 2 or 3 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo2(bomb_type[1], bomb_type[2], i_itemNo);
}
} else if (bomb_num[1] == bomb_max[1] && bomb_max[1] != 0) {
if (bomb_num[2] == bomb_max[2] && bomb_max[2] != 0) {
// "Bag 1 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo(bomb_type[0], i_itemNo);
} else {
// "Bag 1 and 3 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo2(bomb_type[0], bomb_type[2], i_itemNo);
}
} else if (bomb_num[2] == bomb_max[2] && bomb_max[2] != 0) {
// "Bag 1 and 2 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo2(bomb_type[0], bomb_type[1], i_itemNo);
} else {
// "Bag 1, 2 and 3 Get Bomb!\n"
OS_REPORT("\x1b[43;30m袋のバクダンをゲット\n\x1b[m");
i_itemNo = getBombItemNo3(bomb_type[0], bomb_type[1], bomb_type[2], i_itemNo);
}
break;
default:
// "Get Item: Wrong number of bomb bags!<%d>\n"
OS_REPORT("\x1b[41;37mゲットアイテムバクダン袋の数がおかしい<%d>\n\x1b[m", bag_count);
JUT_ASSERT(0xABD, 0);
break;
}
return i_itemNo;
}
/* 804945C8-804946A4 003988 00DC+00 1/1 0/0 0/0 .text setGetDemoItem__8daTbox_cFv */
int daTbox_c::setGetDemoItem() {
u8 item_no = getItemNo();
if (item_no == fpcNm_ITEM_BOMB_5 || item_no == fpcNm_ITEM_BOMB_10 || item_no == fpcNm_ITEM_BOMB_20 || item_no == fpcNm_ITEM_BOMB_30 ||
item_no == fpcNm_ITEM_WATER_BOMB_5 || item_no == fpcNm_ITEM_WATER_BOMB_10 || item_no == fpcNm_ITEM_WATER_BOMB_20 || item_no == fpcNm_ITEM_WATER_BOMB_30 ||
item_no == fpcNm_ITEM_BOMB_INSECT_5 || item_no == fpcNm_ITEM_BOMB_INSECT_10 || item_no == fpcNm_ITEM_BOMB_INSECT_20 || item_no == fpcNm_ITEM_BOMB_INSECT_30)
{
item_no = getBombItemNoMain(item_no);
}
fpc_ProcID item_id;
if (field_0x718) {
item_id = fopAcM_createItemForPresentDemo(&current.pos, item_no, 1, -1, -1, NULL, NULL);
} else {
item_id = fopAcM_createItemForTrBoxDemo(&current.pos, item_no, -1, -1, NULL, NULL);
}
if (item_id != fpcM_ERROR_PROCESS_ID_e) {
dComIfGp_event_setItemPartnerId(item_id);
}
return true;
}
/* 804946A4-804948CC 003A64 0228+00 11/0 0/0 0/0 .text actionOpenWait__8daTbox_cFv */
int daTbox_c::actionOpenWait() {
daMidna_c* midna = daPy_py_c::getMidnaActor();
daPy_py_c* player = daPy_getPlayerActorClass();
if (eventInfo.i_checkCommandDoor()) {
dComIfGp_event_onEventFlag(4);
if (getShapeType() != SHAPE_SMALL && player->i_checkNowWolf() &&
!midna->checkMetamorphoseEnable()) {
setAction(&daTbox_c::actionNotOpenDemo);
mStaffId = dComIfGp_evmng_getMyStaffId(l_staff_name, NULL, 0);
demoProc();
field_0x9f4 = 0;
} else {
field_0x718 = player->checkTreasureRupeeReturn(getItemNo());
setGetDemoItem();
setAction(&daTbox_c::actionDemo);
mStaffId = dComIfGp_evmng_getMyStaffId(l_staff_name, NULL, 0);
demoProc();
field_0x9f4 = 0;
}
} else if (boxCheck()) {
eventInfo.i_onCondition(4);
if (getShapeType() == SHAPE_SMALL) {
eventInfo.setEventName("DEFAULT_TREASURE_SIMPLE");
} else if (player->i_checkNowWolf() && !midna->checkMetamorphoseEnable()) {
eventInfo.setEventName("DEFAULT_TREASURE_NOTOPEN");
} else if (getShapeType() == SHAPE_BOSSKEY) {
eventInfo.setEventId(field_0x984);
} else if (checkEnvEffectTbox()) {
eventInfo.setEventName("DEFAULT_TREASURE_EFFECT");
} else {
eventInfo.setEventName("DEFAULT_TREASURE_NORMAL");
}
}
return true;
}
/* 804948CC-80494950 003C8C 0084+00 1/0 0/0 0/0 .text actionNotOpenDemo__8daTbox_cFv */
int daTbox_c::actionNotOpenDemo() {
if (dComIfGp_evmng_endCheck(mEventId)) {
setAction(&daTbox_c::actionOpenWait);
dComIfGp_event_reset();
} else {
demoProc();
}
return true;
}
/* 80494950-80494A0C 003D10 00BC+00 3/3 0/0 0/0 .text checkDrop__8daTbox_cFv */
int daTbox_c::checkDrop() {
if (getSwType() == 15) {
if (dComIfGs_isSwitch(getSwNo(), fopAcM_GetRoomNo(this))) {
return true;
}
} else if (getSwType() == 0) {
for (int i = 0; i < 4; i++) {
if (fopAcM_isSwitch(this, getSwNo() + i)) {
return true;
}
}
}
return false;
}
/* 80494A0C-80494D88 003DCC 037C+00 1/1 0/0 0/0 .text settingDropDemoCamera__8daTbox_cFv
*/
void daTbox_c::settingDropDemoCamera() {
camera_class* player_camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0));
player_camera->mCamera.Stop();
dStage_MapEvent_dt_c* maptooldata = dEvt_control_c::searchMapEventData(getEvent(), fopAcM_GetRoomNo(this));
JUT_ASSERT(0xB89, maptooldata != 0);
player_camera->mCamera.SetTrimSize(maptooldata->field_0x1);
dStage_roomDt_c* roomdt = dComIfGp_roomControl_getStatusRoomDt(fopAcM_GetRoomNo(this));
JUT_ASSERT(0xB8E, roomdt != 0);
stage_camera_class* stage_camera = roomdt->getCamera();
stage_camera2_data_class* stage_camera_data = stage_camera->mEntries;
stage_camera_data += maptooldata->field_0x16;
stage_arrow_class* stage_arrow = roomdt->getArrow();
stage_arrow_data_class* stage_arrow_data = stage_arrow->mEntries;
stage_arrow_data += stage_camera_data->field_0x10;
cXyz spA0;
cXyz spAC;
spA0.x = stage_arrow_data->mPosition.x;
spA0.z = stage_arrow_data->mPosition.z;
spAC.x = home.pos.x;
spAC.z = home.pos.z;
f32 var_f30 = spA0.abs(spAC);
cXyz spB8;
cXyz spC4(cXyz::BaseY);
s16 angle;
getDropSAngle(&angle);
spB8.x = stage_arrow_data->mPosition.x;
spB8.y = 0.0f;
spB8.z = stage_arrow_data->mPosition.z;
spB8 -= home.pos;
Mtx mtx;
MTXRotAxisRad(mtx, &spC4, cM_s2rad(angle));
mDoMtx_multVec(mtx, &spB8, &spB8);
spB8 += home.pos;
spB8.y = stage_arrow_data->mPosition.y;
cXyz cam_eye;
cXyz cam_center;
cam_eye = spB8;
cam_center = home.pos;
f32 var_f29 = cM_ssin(stage_arrow_data->mAngle.x);
f32 var_f28 = cM_scos(stage_arrow_data->mAngle.x);
f32 dist = var_f30 * (var_f29 / var_f28);
if (stage_arrow_data->mAngle.x > 0) {
dist = -dist;
}
cam_center.y = cam_eye.y + dist;
player_camera->mCamera.Set(cam_center, cam_eye, 0, (f32)stage_camera_data->field_0x11);
field_0x9c9 = 1;
}
/* 80494D88-80494E98 004148 0110+00 1/0 0/0 0/0 .text actionSwOnWait__8daTbox_cFv */
int daTbox_c::actionSwOnWait() {
if (eventInfo.i_checkCommandDemoAccrpt()) {
setAction(&daTbox_c::actionDemo2);
mStaffId = dComIfGp_evmng_getMyStaffId(l_staff_name, NULL, 0);
demoProc();
} else if (dComIfGs_isSwitch(getSwNo(), fopAcM_GetRoomNo(this))) {
if (getEvent() == 0xff) {
fopAcM_orderOtherEvent(this, "DEFAULT_TREASURE_APPEAR", 0xffff, 1, 0);
} else {
fopAcM_orderOtherEventId(this, mEventId, getEvent(), 0xffff, 0, 1);
}
eventInfo.i_onCondition(2);
}
return true;
}
/* 80494E98-80494F44 004258 00AC+00 1/0 0/0 0/0 .text actionSwOnWait2__8daTbox_cFv */
int daTbox_c::actionSwOnWait2() {
if (dComIfGs_isSwitch(getSwNo(), fopAcM_GetRoomNo(this))) {
setAction(&daTbox_c::actionOpenWait);
setDzb();
flagOff(0x43);
int tbox_no = getTboxNo();
dTres_c::onStatus(0, tbox_no, 1);
} else {
flagOn(0x40);
}
return true;
}
/* 80494F44-80495058 004304 0114+00 1/0 0/0 0/0 .text actionDropWait__8daTbox_cFv */
int daTbox_c::actionDropWait() {
if (eventInfo.i_checkCommandDemoAccrpt()) {
setAction(&daTbox_c::actionDropDemo);
clrDzb();
field_0x97d = false;
mStaffId = dComIfGp_evmng_getMyStaffId(l_staff_name, NULL, 0);
if (getSwType() == 0) {
settingDropDemoCamera();
}
} else if (checkDrop()) {
if (mEventId != -1) {
fopAcM_orderOtherEventId(this, mEventId, getEvent(), 0xffff, 0, 1);
eventInfo.i_onCondition(2);
} else {
dropProcInitCall();
setAction(&daTbox_c::actionDropDemo);
field_0x97d = false;
}
}
return true;
}
/* 80495058-8049518C 004418 0134+00 1/0 0/0 0/0 .text actionGenocide__8daTbox_cFv */
int daTbox_c::actionGenocide() {
if (eventInfo.i_checkCommandDemoAccrpt()) {
setAction(&daTbox_c::actionDemo2);
mStaffId = dComIfGp_evmng_getMyStaffId(l_staff_name, NULL, 0);
demoProc();
} else if (!fopAcM_myRoomSearchEnemy(fopAcM_GetRoomNo(this))) {
if (mTimer != 0) {
mTimer--;
} else {
if (getEvent() == 0xff) {
fopAcM_orderOtherEvent(this, "DEFAULT_TREASURE_APPEAR", 0xffff, 1, 0);
} else {
fopAcM_orderOtherEventId(this, mEventId, getEvent(), 0xffff, 0, 1);
}
eventInfo.i_onCondition(2);
dComIfGs_onSwitch(getSwNo(), fopAcM_GetRoomNo(this));
}
}
return true;
}
/* 8049518C-80495250 00454C 00C4+00 1/0 0/0 0/0 .text actionDropWaitForWeb__8daTbox_cFv
*/
int daTbox_c::actionDropWaitForWeb() {
if (field_0x9fd != 0) {
if (field_0x9fc != 0) {
field_0x9fd = 0;
return true;
}
} else {
if (field_0x9fc == 0) {
setAction(&daTbox_c::actionDropForWeb);
shape_angle.z = 0;
shape_angle.x = 0;
fopAcM_SetGravity(this, -2.0f);
fopAcM_onSwitch(this, getSwNo());
// "Treasure Chest: Falling!<%d>\n"
OS_REPORT("宝箱:落下!<%d>\n", getSwNo());
}
}
setBaseMtx();
field_0x9fc = 0;
return true;
}
/* 80495250-804953D4 004610 0184+00 1/0 0/0 0/0 .text actionDropForWeb__8daTbox_cFv */
int daTbox_c::actionDropForWeb() {
fopAcM_posMoveF(this, NULL);
mAcch.CrrPos(dComIfG_Bgsp());
home.pos = current.pos;
attention_info.position = current.pos;
eyePos = current.pos;
setBaseMtx();
if (mAcch.ChkGroundLanding()) {
cXyz vec(2.0f, 2.0f, 2.0f);
dComIfGp_particle_setPolyColor(0xe7, mAcch.m_gnd, &current.pos, &tevStr, &home.angle,
&vec, 0, NULL, fopAcM_GetRoomNo(this), NULL);
dComIfGp_getVibration().StartShock(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f));
setDzb();
if (mpBgCollision != NULL) {
mpBgCollision->Move();
}
setAction(&daTbox_c::actionOpenWait);
}
dTres_c::setPosition(getTboxNo(), &current.pos);
return true;
}
/* 804953D4-80495490 004794 00BC+00 1/1 0/0 0/0 .text initBaseMtx__8daTbox_cFv */
void daTbox_c::initBaseMtx() {
field_0x9c4 = 0;
mRotAxis = cXyz::BaseX;
mDoMtx_identity(field_0x988);
mpModel->setBaseScale(scale);
if (mpSlimeModel != NULL) {
mpSlimeModel->setBaseScale(scale);
}
setBaseMtx();
if (mpBgW != NULL) {
mpBgW->Move();
}
if (mpOpenBgW != NULL) {
mpOpenBgW->Move();
}
}
/* 80495490-80495660 004850 01D0+00 4/4 0/0 0/0 .text setBaseMtx__8daTbox_cFv */
void daTbox_c::setBaseMtx() {
Mtx mtx;
if (field_0x9c4 == 0) {
mDoMtx_identity(mtx);
} else {
MTXRotAxisRad(mtx, &mRotAxis, cM_s2rad(field_0x9c4));
}
s16 angle;
if (getDropSAngle(&angle) && std::fabs(speed.y) > 2.0f) {
cLib_addCalcAngleS(&home.angle.y, angle, 10, 0xc00, 0x400);
shape_angle = home.angle;
}
mDoMtx_stack_c::transS(current.pos);
mDoMtx_stack_c::transM(0.0f, 50.0f, 0.0f);
mDoMtx_stack_c::concat(mtx);
mDoMtx_stack_c::concat(field_0x988);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mDoMtx_stack_c::transM(0.0f, -50.0f, 0.0f);
if (field_0x9fc != 0) {
mpModel->setBaseTRMtx(field_0xa00);
} else {
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
}
mDoMtx_concat(mtx, field_0x988, field_0x988);
MTXCopy(mpModel->getBaseTRMtx(), mBgMtx);
if (mpSlimeModel != NULL) {
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + 15.0f, current.pos.z);
mDoMtx_stack_c::ZXYrotM(shape_angle);
mpSlimeModel->setBaseTRMtx(mDoMtx_stack_c::get());
}
}
/* 804968FC-80496930 00006C 0034+00 0/1 0/0 0/0 .bss l_HIO */
static daTbox_HIO_c l_HIO;
/* 80495660-804956EC 004A20 008C+00 1/1 0/0 0/0 .text mode_proc_call__8daTbox_cFv */
void daTbox_c::mode_proc_call() {
static daTbox_modeFn l_func[2] = {
&daTbox_c::mode_exec_wait,
&daTbox_c::mode_exec,
};
(this->*l_func[mMode])();
}
/* 804956EC-80495818 004AAC 012C+00 1/0 0/0 0/0 .text mode_exec_wait__8daTbox_cFv */
void daTbox_c::mode_exec_wait() {
bool bvar1 = false;
if (field_0x9cc != 0) {
flagOn(0x40);
cXyz start(home.pos);
cXyz end(home.pos);
start.y += 5.0f;
end.y -= 30.0f;
if (fopAcM_lc_c::lineCheck(&start, &end, this) && fopAcM_lc_c::checkMoveBG()) {
bvar1 = true;
home.pos = *fopAcM_lc_c::getCrossP();
current.pos = home.pos;
}
}
if (bvar1) {
flagOff(0x40);
mMode = MODE_EXEC;
mode_exec();
}
}
/* 80495818-80495910 004BD8 00F8+00 2/1 0/0 0/0 .text mode_exec__8daTbox_cFv */
void daTbox_c::mode_exec() {
action();
if (getFuncType() == 5 || getFuncType() == 6 || field_0x9cc == 1) {
fopAcM_posMoveF(this, NULL);
if (field_0x97c) {
mAcch.CrrPos(dComIfG_Bgsp());
} else {
mAcch.ClrGroundHit();
}
attention_info.position = current.pos;
eyePos = current.pos;
setBaseMtx();
if (mpBgCollision == mpOpenBgW) {
mpBgCollision->Move();
}
dTres_c::setPosition(getTboxNo(), &current.pos);
}
}
/* 80495910-804959EC 004CD0 00DC+00 1/1 0/0 0/0 .text create1st__8daTbox_cFv */
cPhs__Step daTbox_c::create1st() {
if (!mParamsInit) {
field_0x980 = home.angle.x;
field_0x982 = home.angle.z;
home.angle.z = 0;
home.angle.x = 0;
mParamsInit = true;
}
if (getShapeType() > 2) {
OS_REPORT("\x1b[43;30mTbox Type Error!!!<%d>\n\x1b[m", getShapeType());
JUT_ASSERT(0xDD8, 0);
}
daTbox_ModelInfo* model_info = getModelInfo();
cPhs__Step step = (cPhs__Step)dComIfG_resLoad(&mPhase, model_info->mArcName);
if (step != cPhs_COMPLEATE_e) {
return step;
}
step = (cPhs__Step)MoveBGCreate(model_info->mArcName, model_info->mClosedDzbResNo,
dBgS_MoveBGProc_TypicalRotY, calcHeapSize(), NULL);
if (step == cPhs_ERROR_e) {
return step;
}
CreateInit();
attention_info.flags = 0x40;
attention_info.flags |= 0x400000;
return step;
}
/* 804959EC-80495AF0 004DAC 0104+00 1/0 0/0 0/0 .text Execute__8daTbox_cFPPA3_A4_f */
int daTbox_c::Execute(Mtx** param_0) {
mode_proc_call();
*param_0 = &mBgMtx;
cXyz center(l_cyl_info[getShapeType()].mCenter);
mDoMtx_stack_c::YrotS(shape_angle.y);
mDoMtx_stack_c::multVec(&center, &center);
center += current.pos;
if ((getSwNo() != 0xff && fopAcM_isSwitch(this, getSwNo())) || getSwNo() == 0xff) {
mCyl.SetC(center);
dComIfG_Ccsp()->Set(&mCyl);
}
return true;
}
/* 80495AF0-80495C9C 004EB0 01AC+00 1/0 0/0 0/0 .text Draw__8daTbox_cFv */
int daTbox_c::Draw() {
if (flagCheck(0x40)) {
return true;
}
g_env_light.settingTevStruct(0x10, &current.pos, &tevStr);
if (mpEffectModel != NULL && mpEffectAnm->getPlaySpeed() != 0.0f) {
g_env_light.setLightTevColorType_MAJI(mpEffectModel, &tevStr);
mpEffectAnm->entry(mpEffectModel->getModelData());
mDoExt_modelUpdateDL(mpEffectModel);
mDoExt_brkAnmRemove(mpEffectModel->getModelData());
}
if (flagCheck(1)) {
return true;
}
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
if (mpSlimeModel != NULL) {
dComIfGd_setXluListBG();
mDoExt_modelUpdateDL(mpSlimeModel);
dComIfGd_setList();
}
mpAnm->entry(mpModel->getModelData());
if (getShapeType() == SHAPE_BOSSKEY) {
fopAcM_setEffectMtx(this, mpModel->getModelData());
}
dComIfGd_setListBG();
mDoExt_modelUpdateDL(mpModel);
dComIfGd_setList();
return true;
}
/* 80495C9C-80495CFC 00505C 0060+00 1/0 0/0 0/0 .text Delete__8daTbox_cFv */
int daTbox_c::Delete() {
if (mpBgCollision != NULL) {
dComIfG_Bgsp().Release(mpBgCollision);
}
dComIfG_resDelete(&mPhase, getModelInfo()->mArcName);
return true;
}
/* 80495CFC-80495E38 0050BC 013C+00 1/0 0/0 0/0 .text daTbox_create1st__FP8daTbox_c */
cPhs__Step daTbox_create1st(daTbox_c* i_this) {
fopAcM_SetupActor(i_this, daTbox_c);
return i_this->create1st();
}
/* 80496004-80496024 0053C4 0020+00 1/0 0/0 0/0 .text daTbox_MoveBGDelete__FP8daTbox_c */
static int daTbox_MoveBGDelete(daTbox_c* i_this) {
return i_this->MoveBGDelete();
}
/* 80496024-80496044 0053E4 0020+00 1/0 0/0 0/0 .text daTbox_MoveBGExecute__FP8daTbox_c
*/
static int daTbox_MoveBGExecute(daTbox_c* i_this) {
return i_this->MoveBGExecute();
}
/* 80496044-80496070 005404 002C+00 1/0 0/0 0/0 .text daTbox_MoveBGDraw__FP8daTbox_c */
static int daTbox_MoveBGDraw(daTbox_c* i_this) {
return i_this->MoveBGDraw();
}
/* 804961B0-804961B8 005570 0008+00 1/0 0/0 0/0 .text Create__8daTbox_cFv */
int daTbox_c::Create() {
return true;
}
/* 804961B8-804961C0 005578 0008+00 1/0 0/0 0/0 .text checkSmallTbox__8daTbox_cFv */
BOOL daTbox_c::checkSmallTbox() {
return true;
}
/* 80496730-80496750 -00001 0020+00 1/0 0/0 0/0 .data daTbox_METHODS */
static actor_method_class daTbox_METHODS = {
(process_method_func)daTbox_create1st,
(process_method_func)daTbox_MoveBGDelete,
(process_method_func)daTbox_MoveBGExecute,
NULL,
(process_method_func)daTbox_MoveBGDraw,
};
/* 80496750-80496780 -00001 0030+00 0/0 0/0 1/0 .data g_profile_TBOX */
extern actor_process_profile_definition g_profile_TBOX = {
fpcLy_CURRENT_e,
4,
fpcPi_CURRENT_e,
PROC_TBOX,
&g_fpcLf_Method.base,
sizeof(daTbox_c),
0,
0,
&g_fopAc_Method.base,
0x10c,
&daTbox_METHODS,
0x44100,
fopAc_ACTOR_e,
fopAc_CULLBOX_CUSTOM_e,
};
AUDIO_INSTANCES