tp/src/d/actor/d_a_obj_cwall.cpp

1002 lines
32 KiB
C++

/**
* @file d_a_obj_cwall.cpp
*
*/
#include "d/actor/d_a_obj_cwall.h"
#include "SSystem/SComponent/c_math.h"
#include "SSystem/SComponent/c_lib.h"
#include "d/actor/d_a_player.h"
#include "Z2AudioLib/Z2Instances.h"
#include "d/d_cc_d.h"
#include "d/d_com_inf_game.h"
#include "cmath.h"
// NONMATCHING - getRightHandPos is not generated at the end of the TU
/* 80BD6A4C-80BD6A88 0000EC 003C+00 1/1 0/0 0/0 .text initBaseMtx__12daObjCwall_cFv */
void daObjCwall_c::initBaseMtx() {
mWallModel->setBaseScale(scale);
setBaseMtx();
}
/* 80BD6A88-80BD6AEC 000128 0064+00 2/2 0/0 0/0 .text setBaseMtx__12daObjCwall_cFv */
void daObjCwall_c::setBaseMtx() {
mDoMtx_stack_c::transS(field_0xf38);
mDoMtx_stack_c::YrotM(shape_angle.y);
mWallModel->setBaseTRMtx(mDoMtx_stack_c::get());
MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
}
/* 80BD9FA4-80BD9FAC 000000 0008+00 11/11 0/0 0/0 .rodata l_wallBmd */
static u32 const l_wallBmd[2] = {
5, 5,
};
/* 80BD9FAC-80BD9FB4 000008 0008+00 0/1 0/0 0/0 .rodata l_chainBmd */
static u32 const l_chainBmd[2] = {
4, 4,
};
/* 80BD9FB4-80BD9FBC 000010 0008+00 0/1 0/0 0/0 .rodata l_handleBmd */
static u32 const l_handleBmd[2] = {
6, 6,
};
/* 80BD9FBC-80BD9FC4 000018 0008+00 1/1 0/0 0/0 .rodata l_dzb */
static u32 const l_dzb[2] = {
9, 9,
};
/* 80BD9FC4-80BD9FCC 000020 0008+00 1/1 0/0 0/0 .rodata l_heap_size */
static u32 const l_heap_size[2] = {
0x4600, 0x5F00,
};
/* 80BD9FCC-80BD9FD8 000028 000C+00 0/1 0/0 0/0 .rodata l_top_co_offset */
static Vec const l_top_co_offset = {
0.0f, 0.0f, -600.0f,
};
/* 80BD9FD8-80BD9FE4 000034 000C+00 0/1 0/0 0/0 .rodata l_check_min */
static Vec const l_check_min = {
-120.0f, 0.0f, -20.0f,
};
/* 80BD9FE4-80BD9FF0 000040 000C+00 0/1 0/0 0/0 .rodata l_check_max */
static Vec const l_check_max = {
120.0f, 0.0f, 80.0f,
};
/* 80BD9FF0-80BD9FFC 00004C 000C+00 0/1 0/0 0/0 .rodata l_check_min_wolf */
static Vec const l_check_min_wolf = {
-120.0f, 0.0f, 50.0f,
};
/* 80BD9FFC-80BDA008 000058 000C+00 0/1 0/0 0/0 .rodata l_check_max_wolf */
static Vec const l_check_max_wolf = {
120.0f, 0.0f, 160.0f,
};
UNK_REL_DATA
/* 80BDA0E0-80BDA0E8 -00001 0008+00 3/3 0/0 0/0 .data l_arcName */
static char* l_arcName[2] = {
"P_Cwall",
"P_L4Cwall",
};
/* 80BDA0E8-80BDA100 000028 0018+00 0/1 0/0 0/0 .data l_cull_box */
static Vec l_cull_box[2] = {
{-300.0f, -100.0f, -650.0f},
{300.0f, 500.0f, 300.0f},
};
/* 80BDA100-80BDA130 000040 0030+00 1/1 0/0 0/0 .data l_side_co_offset */
static Vec l_side_co_offset[4] = {
{-255.0f, 0.0f, -30.0f},
{-135.0f, 0.0f, -30.0f},
{135.0f, 0.0f, -30.0f},
{255.0f, 0.0f, -30.0f},
};
/* 80BDA130-80BDA174 000070 0044+00 0/1 0/0 0/0 .data l_cyl_src */
static dCcD_SrcCyl l_cyl_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0x0, 0x0}, 0x79}}, // mObj
{dCcD_SE_NONE, 0x1, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{0.0f, 0.0f, 0.0f}, // mCenter
70.0f, // mRadius
450.0f // mHeight
} // mCyl
};
/* 80BDA174-80BDA1B8 0000B4 0044+00 0/1 0/0 0/0 .data l_cyl_src2 */
static dCcD_SrcCyl l_cyl_src2 = {
{
{0x0, {{0x0, 0x0, 0x0}, {0x0, 0x0}, 0x19}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{0.0f, 0.0f, 0.0f}, // mCenter
60.0f, // mRadius
300.0f // mHeight
} // mCyl
};
/* 80BDA1B8-80BDA1F8 0000F8 0040+00 0/1 0/0 0/0 .data l_sph_src */
static dCcD_SrcSph l_sph_src = {
{
{0x0, {{0x0, 0x0, 0x0}, {0x4000, 0x11}, 0x58}}, // mObj
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjTg
{0x0}, // mGObjCo
}, // mObjInf
{
{{0.0f, 0.0f, 0.0f}, 50.0f} // mSph
} // mSphAttr
};
/* 80BD6AEC-80BD6CCC 00018C 01E0+00 1/0 0/0 0/0 .text Create__12daObjCwall_cFv */
int daObjCwall_c::Create() {
field_0xf38 = current.pos;
field_0xf0c = getArg0();
initBaseMtx();
fopAcM_SetMtx(this, mWallModel->getBaseTRMtx());
mStts.Init(0xff, 0xff, this);
mCyl.Set(l_cyl_src);
mCyl.SetStts(&mStts);
for (int i = 0; i < 4; i++) {
mCyls[i].Set(l_cyl_src2);
mCyls[i].SetStts(&mStts);
}
mCyl2.Set(l_cyl_src2);
mCyl2.SetStts(&mStts);
mSph.Set(l_sph_src);
mSph.SetStts(&mStts);
fopAcM_setCullSizeBox(this, l_cull_box[0].x, l_cull_box[0].y, l_cull_box[0].z, l_cull_box[1].x,
l_cull_box[1].y, l_cull_box[1].z);
cXyz cStack_30(0.0f, 0.0f, 50.0f);
mDoMtx_stack_c::YrotS(current.angle.y);
mDoMtx_stack_c::multVec(&cStack_30, &cStack_30);
chain_s* pChain = mChains;
cXyz* pPos = field_0xe94;
getChainBasePos(&pChain->mPos);
cXyz cStack_3c(pChain->mPos);
for (int i = 0; i < 7; i++, pPos++) {
*pPos = cStack_3c + cStack_30;
cStack_3c = *pPos;
}
calcSePos();
MoveBGExecute();
return 1;
}
/* 80BD6D08-80BD6E94 0003A8 018C+00 1/0 0/0 0/0 .text CreateHeap__12daObjCwall_cFv */
int daObjCwall_c::CreateHeap() {
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName[mType], l_wallBmd[mType]);
JUT_ASSERT(573, modelData != 0);
mWallModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (mWallModel == NULL) {
return 0;
}
mChains = new chain_s[6];
if (mChains == NULL) {
return 0;
}
modelData =
(J3DModelData*)dComIfG_getObjectRes(l_arcName[mType], l_chainBmd[mType]);
JUT_ASSERT(592, modelData != 0);
chain_s* pChain = mChains;
for (int i = 0; i < 6; i++, pChain++) {
pChain->mModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (pChain->mModel == NULL) {
return 0;
}
}
modelData =
(J3DModelData*)dComIfG_getObjectRes(l_arcName[mType], l_handleBmd[mType]);
JUT_ASSERT(609, modelData != 0);
mHandleModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
if (mHandleModel == NULL) {
return 0;
}
return 1;
}
/* 80BD6E94-80BD6ED0 000534 003C+00 1/1 0/0 0/0 .text __dt__Q212daObjCwall_c7chain_sFv */
daObjCwall_c::chain_s::~chain_s() {
}
/* 80BD6ED0-80BD6ED4 000570 0004+00 1/1 0/0 0/0 .text __ct__Q212daObjCwall_c7chain_sFv */
daObjCwall_c::chain_s::chain_s() {
}
/* 80BD6ED4-80BD6F80 000574 00AC+00 1/1 0/0 0/0 .text create1st__12daObjCwall_cFv */
int daObjCwall_c::create1st() {
mType = getType();
int rv = dComIfG_resLoad(&mPhase, l_arcName[mType]);
if (rv == cPhs_COMPLEATE_e) {
rv = MoveBGCreate(l_arcName[mType], l_dzb[mType], NULL, l_heap_size[mType], NULL);
if (rv == cPhs_ERROR_e) {
return rv;
}
}
return rv;
}
/* 80BD6F80-80BD7288 000620 0308+00 1/0 0/0 0/0 .text Execute__12daObjCwall_cFPPA3_A4_f
*/
int daObjCwall_c::Execute(Mtx** param_1) {
field_0xf44 = field_0xf38;
field_0xf54 = field_0xf50;
chain_control();
chain_s* pChain = mChains;
if (daPy_py_c::setFmChainPos(this, &mChains[5].mPos, field_0xf0c)) {
field_0xe90 = 1;
eyePos = home.pos;
} else {
field_0xe90 = 0;
eyePos = mChains[5].mPos;
if (fopAcM_checkHookCarryNow(this)) {
field_0xf58 = 1;
} else {
field_0xf58 = 0;
current.pos = eyePos;
}
}
if ((field_0xe93 == 0 && field_0xe90 != 0) || (field_0xe93 != 0 && field_0xe90 == 0)) {
daPy_py_c::setPlayerSe(Z2SE_AL_GRAB_CHAIN);
}
chain_control2();
if (field_0xe91 != 0) {
field_0xf1c = 1000;
} else {
field_0xf1c = 7000;
}
setTension();
block_mode_proc_call();
setChainMtx();
if (field_0xe90 != 0) {
for (int i = 0; i < 4; i++) {
cXyz acStack_30(l_side_co_offset[i]);
mDoMtx_stack_c::transS(field_0xf38);
mDoMtx_stack_c::YrotM(home.angle.y);
mDoMtx_stack_c::multVec(&acStack_30, &acStack_30);
mCyls[i].SetC(acStack_30);
dComIfG_Ccsp()->Set(&mCyls[i]);
}
}
cXyz cStack_3c(cXyz::Zero);
mDoMtx_stack_c::transS(field_0xf38);
mDoMtx_stack_c::YrotM(home.angle.y);
mDoMtx_stack_c::multVec(&cStack_3c, &cStack_3c);
mCyl2.SetC(cStack_3c);
dComIfG_Ccsp()->Set(&mCyl2);
*param_1 = &mBgMtx;
setBaseMtx();
calcSePos();
field_0xe93 = field_0xe90;
cXyz cStack_48 = daPy_getPlayerActorClass()->current.pos - current.pos;
s16 angleDiff = cStack_48.atan2sX_Z() - shape_angle.y;
if (abs(angleDiff) < 0x2000) {
mSph.SetC(pChain[5].mPos);
dComIfG_Ccsp()->Set(&mSph);
}
return 1;
}
/* 80BD7288-80BD7718 000928 0490+00 1/1 0/0 0/0 .text setTension__12daObjCwall_cFv */
void daObjCwall_c::setTension() {
daPy_py_c* player = daPy_getPlayerActorClass();
f32 dVar9 = field_0xf54;
field_0xe91 = 0;
if (field_0xe90 == 0) {
field_0xf50 = 0;
}
cXyz acStack_80;
cXyz cStack_8c;
getChainBasePos(&acStack_80);
cStack_8c = field_0xe94[6];
f32 dVar7 = cStack_8c.abs(acStack_80);
f32 dVar10 = 188.0f;
if (field_0xf58 != 0) {
if (current.pos.abs(acStack_80) > dVar10 + 150.0f) {
fopAcM_cancelHookCarryNow(this);
}
} else {
if (field_0xe90 != 0) {
daPy_getPlayerActorClass()->checkBootsOrArmorHeavy();
if ((dVar9 == 0.0f && dVar7 > dVar10 + 20.0f) ||
(dVar9 != 0.0f && dVar7 > dVar10 - 20.0f))
{
field_0xe91 = 1;
if (checkPull()) {
cXyz local_98;
local_98.x = player->getSpeedF() * cM_ssin(player->current.angle.y);
local_98.z = player->getSpeedF() * cM_scos(player->current.angle.y);
field_0xf50 = local_98.absXZ();
} else {
field_0xf50 = 0.0f;
}
} else {
field_0xf50 = 0.0f;
field_0xe91 = 0;
}
if (dVar7 > dVar10 - 20.0f) {
field_0xf12 = 0;
} else {
field_0xf12 = 1;
}
}
}
}
/* 80BD7718-80BD7788 000DB8 0070+00 2/2 0/0 0/0 .text calcSePos__12daObjCwall_cFv */
void daObjCwall_c::calcSePos() {
field_0xf2c.set(0.0f, 0.0f, 300.0f);
mDoMtx_stack_c::transS(field_0xf38);
mDoMtx_stack_c::YrotM(shape_angle.y);
mDoMtx_stack_c::multVec(&field_0xf2c, &field_0xf2c);
}
/* ############################################################################################## */
/* 80BDA300-80BDA304 000008 0001+03 1/1 0/0 0/0 .bss @1109 */
static u8 lit_1109[1 + 3 /* padding */];
/* 80BDA304-80BDA308 00000C 0001+03 0/0 0/0 0/0 .bss @1107 */
#pragma push
#pragma force_active on
static u8 lit_1107[1 + 3 /* padding */];
#pragma pop
/* 80BDA308-80BDA30C 000010 0001+03 0/0 0/0 0/0 .bss @1105 */
#pragma push
#pragma force_active on
static u8 lit_1105[1 + 3 /* padding */];
#pragma pop
/* 80BDA30C-80BDA310 000014 0001+03 0/0 0/0 0/0 .bss @1104 */
#pragma push
#pragma force_active on
static u8 lit_1104[1 + 3 /* padding */];
#pragma pop
/* 80BDA310-80BDA314 000018 0001+03 0/0 0/0 0/0 .bss @1099 */
#pragma push
#pragma force_active on
static u8 lit_1099[1 + 3 /* padding */];
#pragma pop
/* 80BDA314-80BDA318 00001C 0001+03 0/0 0/0 0/0 .bss @1097 */
#pragma push
#pragma force_active on
static u8 lit_1097[1 + 3 /* padding */];
#pragma pop
/* 80BDA318-80BDA31C 000020 0001+03 0/0 0/0 0/0 .bss @1095 */
#pragma push
#pragma force_active on
static u8 lit_1095[1 + 3 /* padding */];
#pragma pop
/* 80BDA31C-80BDA320 000024 0001+03 0/0 0/0 0/0 .bss @1094 */
#pragma push
#pragma force_active on
static u8 lit_1094[1 + 3 /* padding */];
#pragma pop
/* 80BDA320-80BDA324 000028 0001+03 0/0 0/0 0/0 .bss @1057 */
#pragma push
#pragma force_active on
static u8 lit_1057[1 + 3 /* padding */];
#pragma pop
/* 80BDA324-80BDA328 00002C 0001+03 0/0 0/0 0/0 .bss @1055 */
#pragma push
#pragma force_active on
static u8 lit_1055[1 + 3 /* padding */];
#pragma pop
/* 80BDA328-80BDA32C 000030 0001+03 0/0 0/0 0/0 .bss @1053 */
#pragma push
#pragma force_active on
static u8 lit_1053[1 + 3 /* padding */];
#pragma pop
/* 80BDA32C-80BDA330 000034 0001+03 0/0 0/0 0/0 .bss @1052 */
#pragma push
#pragma force_active on
static u8 lit_1052[1 + 3 /* padding */];
#pragma pop
/* 80BDA330-80BDA334 000038 0001+03 0/0 0/0 0/0 .bss @1014 */
#pragma push
#pragma force_active on
static u8 lit_1014[1 + 3 /* padding */];
#pragma pop
/* 80BDA334-80BDA338 00003C 0001+03 0/0 0/0 0/0 .bss @1012 */
#pragma push
#pragma force_active on
static u8 lit_1012[1 + 3 /* padding */];
#pragma pop
/* 80BDA338-80BDA33C 000040 0001+03 0/0 0/0 0/0 .bss @1010 */
#pragma push
#pragma force_active on
static u8 lit_1010[1 + 3 /* padding */];
#pragma pop
/* 80BDA33C-80BDA340 000044 0001+03 0/0 0/0 0/0 .bss @1009 */
#pragma push
#pragma force_active on
static u8 lit_1009[1 + 3 /* padding */];
#pragma pop
/* 80BDA34C-80BDA358 000054 000C+00 1/2 0/0 0/0 .bss l_chainOffset */
static cXyz l_chainOffset(0.0f, 105.0f, 30.0f);
/* 80BD7788-80BD7804 000E28 007C+00 5/5 0/0 0/0 .text getChainBasePos__12daObjCwall_cFP4cXyz */
void daObjCwall_c::getChainBasePos(cXyz* pBasePos) {
*pBasePos = l_chainOffset;
mDoMtx_stack_c::transS(field_0xf38);
mDoMtx_stack_c::YrotM(current.angle.y);
mDoMtx_stack_c::multVec(pBasePos, pBasePos);
}
/* 80BD7804-80BD7AD4 000EA4 02D0+00 1/1 0/0 0/0 .text setChainMtx__12daObjCwall_cFv */
void daObjCwall_c::setChainMtx() {
chain_s* pChain = mChains;
s16 sVar7 = home.angle.y;
if (sVar7 == 0x4000 || sVar7 == 0xc000) {
sVar7 += 0x4000;
}
daPy_py_c* player = daPy_getPlayerActorClass();
for (int i = 0; i < 6; pChain++, i++) {
cXyz local_34 = field_0xe94[i + 1] - field_0xe94[i];
s16 sVar3 = cM_atan2s(local_34.x, local_34.z);
if (field_0xe90 != 0 && i == 5) {
sVar3 = player->shape_angle.y + 0x7fff;
}
s16 sVar4 = -cM_atan2s(local_34.y, local_34.absXZ());
sVar7 += 0x4000;
mDoMtx_stack_c::transS(pChain->mPos);
mDoMtx_stack_c::ZXYrotM(sVar4, sVar3, sVar7);
if (i == 5) {
if (field_0xe90 != 0) {
sVar3 = player->shape_angle.y + 0x7fff;
mDoMtx_stack_c::transS(field_0xf20);
mDoMtx_stack_c::YrotM(sVar3);
mDoMtx_stack_c::XrotM(-field_0xf1a);
mDoMtx_stack_c::ZrotM(0);
}
mHandleModel->setBaseTRMtx(mDoMtx_stack_c::get());
} else {
pChain->mModel->setBaseTRMtx(mDoMtx_stack_c::get());
}
}
cLib_addCalcAngleS2(&field_0xf1a, field_0xf1c, 5, 0x800);
}
/* 80BD7AD4-80BD7ED8 001174 0404+00 1/1 0/0 0/0 .text chain_control__12daObjCwall_cFv */
void daObjCwall_c::chain_control() {
cXyz* nextPos;
cXyz* pos;
nextPos = field_0xe94;
chain_s* pChain = mChains;
getChainBasePos(field_0xe94);
pos = nextPos;
f32 dVar10 = -6.0f;
nextPos++;
for (int i = 1; i < 7; i = i + 1) {
if (field_0xe90 != 0) {
if (!daPy_getPlayerActorClass()->checkBootsOrArmorHeavy()) {
if (field_0xf50 > 5.0f || field_0xf58 != 0) {
dVar10 *= 0.1f;
} else {
dVar10 = -6.0f;
}
}
}
field_0xee8[i] = dVar10;
f32 dVar9 = nextPos->y;
nextPos->y += field_0xee8[i];
cXyz acStack_80(*nextPos);
acStack_80.y += 100.0f;
field_0xf04[i] = 0;
if (fopAcM_gc_c::gndCheck(&acStack_80)) {
f32 dVar8 = 15.0f + fopAcM_gc_c::getGroundY();
if (dVar8 > nextPos->y) {
nextPos->y = dVar8;
field_0xee8[i] = 0;
field_0xf04[i] = 1;
}
}
if (field_0xf04[i] == 0) {
if (field_0xf04[i - 1] != 0) {
if (pos->y >= nextPos->y) {
nextPos->y = dVar9;
}
}
if (i < 6 && field_0xf04[i + 1] != 0) {
if (pChain[1].mPos.y >= nextPos->y) {
nextPos->y = dVar9;
}
}
}
cXyz cStack_8c = *nextPos - *pos;
f32 dVar8 = cStack_8c.abs();
cStack_8c.normalizeZP();
f32 fVar1 = 38.0f;
if (i == 6) {
fVar1 = 5.0f;
}
if (dVar8 <= fVar1 - 8.0f) {
dVar8 = fVar1 - 8.0f;
}
if (dVar8 > fVar1) {
dVar8 = fVar1;
}
cStack_8c = cStack_8c * dVar8;
*nextPos = *pos + cStack_8c;
pChain->mPos.x = (pos->x + nextPos->x) * 0.5f;
pChain->mPos.y = (pos->y + nextPos->y) * 0.5f;
pChain->mPos.z = (pos->z + nextPos->z) * 0.5f;
pChain++;
pos = nextPos;
nextPos++;
}
}
/* 80BD7ED8-80BD84C0 001578 05E8+00 1/1 0/0 0/0 .text chain_control2__12daObjCwall_cFv */
void daObjCwall_c::chain_control2() {
daPy_py_c* player = daPy_getPlayerActorClass();
chain_s* local_130 = &mChains[5];
cXyz* local_134 = &field_0xe94[6];
field_0xf50 = 0.0f;
if ((field_0xe90 == 0) && (field_0xf58 == 0)) {
field_0xf1c = 0;
current.pos = local_130->mPos;
} else {
cXyz acStack_98;
cXyz cStack_a4;
if (field_0xe90 != 0) {
if (daPy_py_c::i_checkNowWolf()) {
mDoMtx_stack_c::copy(player->getWolfMouthMatrix());
mDoMtx_stack_c::multVecZero(&acStack_98);
cXyz cStack_b0(0.0f, 0.0f, 60.0f);
mDoMtx_stack_c::YrotS(player->shape_angle.y);
mDoMtx_stack_c::XrotM(field_0xf1a);
mDoMtx_stack_c::multVec(&cStack_b0, &cStack_b0);
*local_134 = cStack_b0 + acStack_98;
field_0xf20 = *local_134;
acStack_98.set(0.0f, 0.0f, -10.0f);
} else {
acStack_98 = player->getRightHandPos();
cXyz cStack_bc(25.0f, 10.0f, 60.0f);
mDoMtx_stack_c::YrotS(player->shape_angle.y);
mDoMtx_stack_c::XrotM(field_0xf1a);
mDoMtx_stack_c::multVec(&cStack_bc, &cStack_bc);
cStack_bc += acStack_98;
*local_134 = cStack_bc;
field_0xf20 = *local_134;
acStack_98.set(0.0f, 0.0f, -10.0f);
}
mDoMtx_stack_c::YrotS(player->shape_angle.y + 0x7fff);
mDoMtx_stack_c::XrotM(-field_0xf1a);
mDoMtx_stack_c::multVec(&acStack_98, &cStack_a4);
cStack_a4 += field_0xf20;
*local_134 = cStack_a4;
} else {
if (field_0xf58 != 0) {
field_0xf20 = current.pos;
*local_134 = current.pos;
;
}
}
f32 dVar12 = 0.0f;
cXyz cStack_c8;
cXyz cStack_d4;
getChainBasePos(&cStack_c8);
cStack_d4 = field_0xe94[6];
f32 dVar10 = cStack_d4.abs(cStack_c8);
f32 dVar11 = 188.0f;
if (dVar10 > dVar11) {
dVar12 = (dVar10 - dVar11) / 6.0f;
}
cXyz* pPos = local_134;
int i = 5;
dVar12 = 38.0f + dVar12;
local_134--;
for (; i >= 1; i--) {
dVar10 = local_134->y;
cXyz cStack_e0(*local_134);
cStack_e0.y += 100.0f;
if (fopAcM_gc_c::gndCheck(&cStack_e0)) {
f32 gnd = fopAcM_gc_c::getGroundY() + 15.0f;
if (gnd > local_134->y) {
local_134->y = gnd;
field_0xee8[i] = 0;
}
}
if (field_0xf04[i + 1] != 0) {
local_134->y = dVar10;
}
cXyz cStack_ec = *local_134 - *pPos;
cStack_ec.normalizeZP();
f32 fVar5 = dVar12;
if (i == 5) {
fVar5 = 5.0f;
}
cStack_ec = cStack_ec * fVar5;
*local_134 = *pPos + cStack_ec;
local_130->mPos.x = (pPos->x + local_134->x) * 0.5f;
local_130->mPos.y = (pPos->y + local_134->y) * 0.5f;
local_130->mPos.z = (pPos->z + local_134->z) * 0.5f;
local_130--;
pPos = local_134;
local_134--;
}
}
}
/* 80BDA364-80BDA370 00006C 000C+00 0/1 0/0 0/0 .bss l_smokeSetOffset */
static cXyz l_smokeSetOffset(0.0f,0.0f,-200.0f);
/* 80BD84C0-80BD8594 001B60 00D4+00 1/1 0/0 0/0 .text block_mode_proc_call__12daObjCwall_cFv */
void daObjCwall_c::block_mode_proc_call() {
static daObjCwall_c::modeFunc l_func[3] = {
&daObjCwall_c::modeWait,
&daObjCwall_c::modeWalk,
&daObjCwall_c::modeClose,
};
(this->*(l_func[field_0xe92]))();
if (field_0xf50 != 0.0f) {
setPower(field_0xf50, NULL);
}
}
/* 80BD8594-80BD85C0 001C34 002C+00 2/2 0/0 0/0 .text initWait__12daObjCwall_cFv */
void daObjCwall_c::initWait() {
speed.setall(0.0f);
field_0xf0e = 0;
field_0xf10 = 20;
field_0xe92 = 0;
}
/* 80BD85C0-80BD8748 001C60 0188+00 1/0 0/0 0/0 .text modeWait__12daObjCwall_cFv */
void daObjCwall_c::modeWait() {
u8 bVar2;
daPy_py_c* player = static_cast<daPy_py_c*>(daPy_getPlayerActorClass());
u8 dVar1 = field_0xf0e;
if (field_0xe90 != 0) {
bVar2 = true;
if (player->checkBootsOrArmorHeavy() && field_0xf12 == 0) {
bVar2 = false;
}
if (checkPullNow()) {
field_0xf0e++;
if (field_0xf50 != 0.0f && !checkWall() && player->getBaseAnimeFrame() > 6.0f &&
player->getBaseAnimeFrame() < 8.0f && field_0xf0e > 8)
{
initWalk();
}
} else {
if (bVar2 && cLib_calcTimer(&field_0xf10) == 0 && field_0xf0d != 0) {
field_0xf59 = field_0xf0d;
initClose();
}
}
} else {
field_0xf0e = 0;
if (field_0xf0d != 0) {
field_0xf59 = field_0xf0d;
initClose();
}
}
if (field_0xf0d == 9 || dVar1 == field_0xf0e) {
field_0xf0e = 0;
}
}
/* 80BD8748-80BD8778 001DE8 0030+00 2/2 0/0 0/0 .text initWalk__12daObjCwall_cFv */
void daObjCwall_c::initWalk() {
speed.setall(0.0f);
field_0xf14 = 13;
field_0xf16 = 0x9d8;
field_0xe92 = 1;
}
/* 80BD8778-80BD8BC8 001E18 0450+00 1/0 0/0 0/0 .text modeWalk__12daObjCwall_cFv */
void daObjCwall_c::modeWalk() {
s16 bVar1 = 13;
f32 dVar7 = 75.0f;
cLib_calcTimer(&field_0xf14);
f32 dVar6 = cM_scos(
field_0xf16 * (bVar1 - field_0xf14));
dVar6 = (1.0f - dVar6) * 0.5f;
cXyz local_78(0.0f, 0.0f, 1.0f);
mDoMtx_stack_c::YrotS(home.angle.y);
mDoMtx_stack_c::multVec(&local_78, &local_78);
field_0xf38.x = home.pos.x + local_78.x * (dVar7 * (field_0xf0d + dVar6));
field_0xf38.z = home.pos.z + local_78.z * (dVar7 * (field_0xf0d + dVar6));
speed.z = std::fabs(field_0xf38.absXZ(field_0xf44));
daPy_py_c* player = daPy_getPlayerActorClass();
s16 local_88 = player->current.angle.y + 0x7fff;
cXyz local_84;
local_84.x = player->getSpeedF() * cM_ssin(player->current.angle.y);
local_84.z = (player->getSpeedF() * cM_scos(player->current.angle.y));
setPower(std::sqrt(local_84.x * local_84.x + local_84.z * local_84.z), &local_88);
setPower(speed.z, &shape_angle.y);
field_0xf50 = 0;
mDoAud_seStartLevel(Z2SE_OBJ_CWALL_MOVE, &field_0xf2c, 0, 0);
if (field_0xf14 == 0) {
initWait();
field_0xf0d++;
if (field_0xf0d == 9) {
mDoAud_seStart(Z2SE_OBJ_CWALL_MOVE_STOP, &field_0xf2c, 0, 0);
}
}
}
/* 80BD8BC8-80BD8BF0 002268 0028+00 1/1 0/0 0/0 .text initClose__12daObjCwall_cFv */
void daObjCwall_c::initClose() {
speed.setall(0.0f);
field_0xf0e = 0;
field_0xe92 = 2;
}
/* 80BD8BF0-80BD935C 002290 076C+00 1/0 0/0 0/0 .text modeClose__12daObjCwall_cFv */
void daObjCwall_c::modeClose() {
daPy_py_c* player = daPy_getPlayerActorClass();
f32 dVar11 = field_0xf38.absXZ(home.pos);
bool bVar6 = false;
u8 dVar1 = field_0xf0e;
if (field_0xe90 != 0) {
cXyz cStack_a4;
cXyz cStack_b0;
getChainBasePos(&cStack_a4);
cStack_b0 = field_0xe94[6];
if (cStack_b0.abs(cStack_a4) > 188.0f) {
field_0xe91 = 1;
if (player->getSpeedF() == 0.0f) {
field_0xf50 = speed.z;
} else {
if (checkPull()) {
field_0xf50 = std::fabs(player->getSpeedF()) + std::fabs(speed.z);
} else {
field_0xf50 = 0.0f;
}
}
} else {
field_0xe91 = 0;
}
if (field_0xe91 != 0 && checkPullNow()) {
field_0xf0e++;
} else {
field_0xf0e = 0;
}
if (field_0xf0e >= 8) {
bVar6 = true;
}
}
if (dVar1 == field_0xf0e) {
field_0xf0e = 0;
}
speed.z += 0.01f;
if (speed.z > 1.5f) {
speed.z = 1.5f;
}
int iVar7 = cLib_chasePos(&field_0xf38, home.pos, std::fabs(speed.z));
f32 dVar12 = field_0xf38.absXZ(home.pos);
if (iVar7 != 0) {
if (bVar6) {
field_0xf0d = 0;
initWalk();
} else {
OS_REPORT("引き戸:閉じました!\n");
dComIfGp_getVibration().StartShock(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f));
field_0xf0d = 0;
mDoAud_seStart(Z2SE_OBJ_CWALL_BACK_STOP, &field_0xf2c, 0, 0);
initWait();
if (field_0xf59 >= 5 && getSwbit() != 0xff) {
fopAcM_onSwitch(this, getSwbit());
}
}
field_0xf59 = 0;
} else {
s32 iVar7 = (int)dVar11 / 75;
int temp = (int)dVar12 / 75;
if (temp != iVar7) {
if (bVar6) {
field_0xf0d = iVar7;
initWait();
field_0xf0e = 8;
} else {
if (daPy_getPlayerActorClass()->checkBootsOrArmorHeavy()) {
mDoAud_seStart(Z2SE_OBJ_CWALL_CHAIN_TENSION, &mChains[0].mPos, 0, 0);
field_0xf0d = iVar7;
initWait();
}
}
}
if (daPy_getPlayerActorClass()->checkBootsOrArmorHeavy()) {
mDoAud_seStartLevel(Z2SE_OBJ_CWALL_BACK_SLOW, &field_0xf2c, 0, 0);
} else {
mDoAud_seStartLevel(Z2SE_OBJ_CWALL_BACK, &field_0xf2c, 0, 0);
}
}
cXyz cStack_bc(l_top_co_offset);
mDoMtx_stack_c::transS(field_0xf38);
mDoMtx_stack_c::YrotM(home.angle.y);
mDoMtx_stack_c::multVec(&cStack_bc,&cStack_bc);
mCyl.SetC(cStack_bc);
dComIfG_Ccsp()->Set(&mCyl);
}
/* 80BD935C-80BD9414 0029FC 00B8+00 2/2 0/0 0/0 .text setPower__12daObjCwall_cFfPs */
void daObjCwall_c::setPower(f32 param_1, s16* param_2) {
daPy_py_c* player = daPy_getPlayerActorClass();
s16 sVar3;
if (param_2 == NULL) {
chain_s* pChain = mChains;
cXyz local_28;
local_28 = pChain[4].mPos - pChain[5].mPos;
sVar3 = cM_atan2s(local_28.x, local_28.z);
} else {
sVar3 = *param_2;
}
player->setOutPower(param_1, sVar3, 0);
field_0xf0f = 1;
}
/* 80BD9414-80BD95A0 002AB4 018C+00 1/1 0/0 0/0 .text checkWall__12daObjCwall_cFv */
BOOL daObjCwall_c::checkWall() {
cXyz acStack_30[2] = {cXyz(-95.0f, 5.0f, 1.0f), cXyz(95.0f, 5.0f, 1.0f)};
cXyz cStack_40(0.0f, 0.0f, 1.0f);
cStack_40.z = 75.0f;
BOOL rv = FALSE;
mDoMtx_stack_c::YrotS(current.angle.y);
for (int i = 0; i < 2; i = i + 1) {
cXyz cStack_4c(acStack_30[i]);
cXyz cStack_58(cStack_40);
mDoMtx_stack_c::multVec(&cStack_4c, &cStack_4c);
cStack_4c += field_0xf38;
mDoMtx_stack_c::multVec(&cStack_58, &cStack_58);
cStack_58 += cStack_4c;
if (fopAcM_lc_c::lineCheck(&cStack_4c, &cStack_58, this)) {
rv = TRUE;
}
}
return rv;
}
/* 80BD95A0-80BD977C 002C40 01DC+00 2/2 0/0 0/0 .text checkPullNow__12daObjCwall_cFv */
BOOL daObjCwall_c::checkPullNow() {
daPy_py_c* player = daPy_getPlayerActorClass();
s16 dummy;
bool iVar2 = player->getStickAngleFromPlayerShape(&dummy);
cXyz cStack_20(0.0f, 0.0f, 290.0f);
mDoMtx_stack_c::transS(field_0xf38);
mDoMtx_stack_c::YrotM(shape_angle.y);
mDoMtx_stack_c::multVec(&cStack_20, &cStack_20);
cXyz local_2c = player->current.pos - cStack_20;
mDoMtx_stack_c::YrotS(-current.angle.y);
mDoMtx_stack_c::multVec(&local_2c, &local_2c);
cXyz local_38;
cXyz local_44;
if (daPy_py_c::i_checkNowWolf()) {
local_38 = l_check_min_wolf;
local_44 = l_check_max_wolf;
} else {
local_38 = l_check_min;
local_44 = l_check_max;
}
if (local_38.x <= local_2c.x && local_2c.x <= local_44.x && local_38.z <= local_2c.z &&
local_2c.z <= local_44.z && iVar2)
{
return 1;
}
return 0;
}
/* 80BD977C-80BD9848 002E1C 00CC+00 2/2 0/0 0/0 .text checkPull__12daObjCwall_cFv */
BOOL daObjCwall_c::checkPull() {
daPy_py_c* player = daPy_getPlayerActorClass();
cXyz local_2c;
cXyz cStack_38 = mChains[0].mPos - mChains[5].mPos;
local_2c.x = player->getSpeedF() * cM_ssin(player->current.angle.y);
local_2c.z = player->getSpeedF() * cM_scos(player->current.angle.y);
if (field_0xe90 != 0 && cStack_38.inprodXZ(local_2c) < 0.0f) {
return 1;
}
return 0;
}
/* 80BD9848-80BD9948 002EE8 0100+00 1/0 0/0 0/0 .text Draw__12daObjCwall_cFv */
int daObjCwall_c::Draw() {
g_env_light.settingTevStruct( 0x10,
&field_0xf38, &tevStr);
g_env_light.setLightTevColorType_MAJI(
mWallModel,
&tevStr);
dComIfGd_setListBG();
mDoExt_modelUpdateDL(mWallModel);
dComIfGd_setList();
chain_s* pChain = mChains;
for (int i = 0; i < 5; pChain++, i++) {
g_env_light.setLightTevColorType_MAJI(pChain->mModel, &tevStr);
mDoExt_modelUpdateDL(pChain->mModel);
}
g_env_light.setLightTevColorType_MAJI(mHandleModel, &tevStr);
mDoExt_modelUpdateDL(mHandleModel);
return 1;
}
/* 80BD9948-80BD9988 002FE8 0040+00 1/0 0/0 0/0 .text Delete__12daObjCwall_cFv */
int daObjCwall_c::Delete() {
dComIfG_resDelete(&mPhase, l_arcName[mType]);
return 1;
}
/* 80BD9988-80BD9B70 003028 01E8+00 1/0 0/0 0/0 .text daObjCwall_create1st__FP12daObjCwall_c */
static int daObjCwall_create1st(daObjCwall_c* i_this) {
fopAcM_SetupActor(i_this, daObjCwall_c);
return i_this->create1st();
}
/* 80BD9DF8-80BD9E18 003498 0020+00 1/0 0/0 0/0 .text daObjCwall_MoveBGDelete__FP12daObjCwall_c */
static int daObjCwall_MoveBGDelete(daObjCwall_c* i_this) {
return i_this->MoveBGDelete();
}
/* 80BD9E18-80BD9E38 0034B8 0020+00 1/0 0/0 0/0 .text daObjCwall_MoveBGExecute__FP12daObjCwall_c
*/
static int daObjCwall_MoveBGExecute(daObjCwall_c* i_this) {
return i_this->MoveBGExecute();
}
/* 80BD9E38-80BD9E64 0034D8 002C+00 1/0 0/0 0/0 .text daObjCwall_MoveBGDraw__FP12daObjCwall_c */
static int daObjCwall_MoveBGDraw(daObjCwall_c* i_this) {
return i_this->Draw();
}
/* 80BDA240-80BDA260 -00001 0020+00 1/0 0/0 0/0 .data daObjCwall_METHODS */
static actor_method_class daObjCwall_METHODS = {
(process_method_func)daObjCwall_create1st,
(process_method_func)daObjCwall_MoveBGDelete,
(process_method_func)daObjCwall_MoveBGExecute,
NULL,
(process_method_func)daObjCwall_MoveBGDraw,
};
/* 80BDA260-80BDA290 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_ChainWall */
extern actor_process_profile_definition g_profile_Obj_ChainWall = {
fpcLy_CURRENT_e, // mLayerID
3, // mListID
fpcPi_CURRENT_e, // mListPrio
PROC_Obj_ChainWall, // mProcName
&g_fpcLf_Method.base, // sub_method
sizeof(daObjCwall_c), // mSize
0, // mSizeOther
0, // mParameters
&g_fopAc_Method.base, // sub_method
598, // mPriority
&daObjCwall_METHODS, // sub_method
0x000C0000, // mStatus
fopAc_ACTOR_e, // mActorType
fopAc_CULLBOX_CUSTOM_e, // cullType
};
AUDIO_INSTANCES
/* 80BDA0AC-80BDA0AC 000108 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */