mirror of
https://github.com/zeldaret/tp
synced 2026-06-10 04:54:14 -04:00
ebe7c7aabc
* d_a_npc_ks debug code 100% * d_a_npc_rafrel debug code 100% * d_a_npc_inko minor improvements * d_a_npc_gro debug code 100% * d_a_npc_pachi_taro debug code 100% * d_a_npc_passer debug code 100% * d_a_npc_pachi_maro debug code 100% * d_a_npc_post debug code 100% * d_a_obj_bemos debug improvements * d_a_obj_scannon_ten debug code 100% * d_a_b_mgn debug code 100% * d_a_e_fb debug code 100% * d_a_e_gb debug code 100% * d_a_e_hz debug code 100% * d_a_e_cr_egg debug code 100% * d_a_e_md debug code 100% * d_a_e_wb debug code 100% * d_a_obj_mirror_6pole debug code 100% * d_a_obj_spinLift debug data fixes * d_a_obj_pdwall debug data fixes * d_a_obj_ss_drink debug code almost matching * d_a_obj_poFire debug code 100% * d_a_obj_picture debug code 100% * d_a_obj_dust debug code 100% * d_a_obj_fallobj debug code 100% * d_a_obj_itamato debug code almost matching * d_a_obj_syRock debug code 100% * d_a_obj_katatsumuri debug code 100% * d_a_obj_wood_statue debug code 100% * d_a_obj_lv6egate debug code 100% * d_a_tag_qs minor debug symbol fixes * d_a_obj_twGate debug code 100% * d_a_obj_lv6SwGate debug code 100% * d_a_obj_lv6swturn debug code 100% * d_a_obj_lv6Tenbin debug code 100% * d_a_obj_kwheel01 debug code 100% * Fix RTTI order regression (cM3dGCyl vs cBgS_*)
383 lines
11 KiB
C++
383 lines
11 KiB
C++
/**
|
|
* @file d_a_obj_kwheel01.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_kwheel01.h"
|
|
#include "JSystem/JHostIO/JORMContext.h"
|
|
#include "SSystem/SComponent/c_math.h"
|
|
#include "d/actor/d_a_obj_klift00.h"
|
|
#include "d/actor/d_a_obj_kwheel00.h"
|
|
#include "d/d_bg_w.h"
|
|
#include "d/d_com_inf_game.h"
|
|
|
|
static int daObjKWheel01_create1st(daObjKWheel01_c*);
|
|
static int daObjKWheel01_MoveBGDelete(daObjKWheel01_c*);
|
|
static int daObjKWheel01_MoveBGExecute(daObjKWheel01_c*);
|
|
static int daObjKWheel01_MoveBGDraw(daObjKWheel01_c*);
|
|
|
|
static const u32 l_dzbidx[3] = {9, 8, 10};
|
|
|
|
static const int l_bmdidx[2] = {4, 5};
|
|
|
|
static const char* l_arcName = "K_Wheel01";
|
|
|
|
// Likely to have been a macro; matches for loop at beginning of create1st for both debug and retail, despite retail only calling getArg4567()
|
|
#define CHECK_KLIFT_EXISTS(kLiftNum) (!((1 << kLiftNum) & getArg4567()))
|
|
|
|
#if DEBUG
|
|
static daObjKWheel01_HIO_c l_HIO;
|
|
|
|
daObjKWheel01_HIO_c::daObjKWheel01_HIO_c() {
|
|
mTargetYAngularSpeed = 64;
|
|
mYAngularAcceleration = 2;
|
|
}
|
|
|
|
void daObjKWheel01_HIO_c::genMessage(JORMContext* ctx) {
|
|
// "Pulley"
|
|
ctx->genLabel("滑車", 0);
|
|
|
|
// "Rotational speed"
|
|
ctx->genSlider("回転速度", &mTargetYAngularSpeed, 0, 0x2000);
|
|
|
|
// "Rotational acceleration"
|
|
ctx->genSlider("回転加速度", &mYAngularAcceleration, 0, 0x20);
|
|
}
|
|
#endif
|
|
|
|
static Vec l_pos[4] = {
|
|
{930.0f, -165.0f, 0.0f}, {0.0f, -165.0f, 930.0f},
|
|
{-930.0f, -165.0f, 0.0f}, {0.0f, -165.0f, -930.0f}
|
|
};
|
|
|
|
cPhs_Step daObjKWheel01_c::create1st() {
|
|
bool atLeastOneKLiftExists = false;
|
|
s8 debugStackVar;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (CHECK_KLIFT_EXISTS(i)) {
|
|
atLeastOneKLiftExists = true;
|
|
}
|
|
}
|
|
|
|
if (!mCreatedKLifts) {
|
|
setMtx();
|
|
u32 createLiftParameters = (getArg2() & 0x3F) | daObjKLift00_c::LOCK_e | daObjKLift00_c::NO_BASE_DISP;
|
|
for (int i = 0; i < 4; i++) {
|
|
if (CHECK_KLIFT_EXISTS(i)) {
|
|
cXyz kLiftPos;
|
|
MTXMultVec(mNewBgMtx, &l_pos[i], &kLiftPos);
|
|
m_klift_pid[i] = fopAcM_create(PROC_Obj_KLift00, createLiftParameters, &kLiftPos, fopAcM_GetHomeRoomNo(this), 0, 0, -1);
|
|
JUT_ASSERT(146, m_klift_pid[i] != fpcM_ERROR_PROCESS_ID_e);
|
|
|
|
mCreatedKLifts = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
cPhs_Step phase = static_cast<cPhs_Step>(dComIfG_resLoad(this, l_arcName));
|
|
if (phase == cPhs_COMPLEATE_e) {
|
|
mYAngularVelocity = 0;
|
|
setMtx();
|
|
|
|
u32 dzbId;
|
|
if (getOut()) {
|
|
dzbId = l_dzbidx[2];
|
|
} else {
|
|
dzbId = l_dzbidx[0];
|
|
}
|
|
phase = static_cast<cPhs_Step>(MoveBGCreate(l_arcName, dzbId, dBgS_MoveBGProc_TypicalRotY, 0x5D98, &mNewBgMtx));
|
|
if (phase == cPhs_ERROR_e) {
|
|
return phase;
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (CHECK_KLIFT_EXISTS(i) && dComIfG_Bgsp().Regist(mKLiftCollisions[i], this)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
|
|
#if DEBUG
|
|
// "Pulley(Lv3)"
|
|
l_HIO.entryHIO("滑車(Lv3)");
|
|
#endif
|
|
}
|
|
|
|
return phase;
|
|
}
|
|
|
|
static const cull_box l_cull_box = {
|
|
{-1260.0f, -3050.0f, -1260.0f},
|
|
{1260.0f, 2800.0f, 1260.0f}
|
|
};
|
|
|
|
void daObjKWheel01_c::setMtx() {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
|
|
MTXCopy(mDoMtx_stack_c::get(), mTransformMtx);
|
|
MTXCopy(mDoMtx_stack_c::get(), mNewBgMtx);
|
|
|
|
if (mYAngularVelocity) {
|
|
mDoMtx_stack_c::copy(mTransformMtx);
|
|
mDoMtx_stack_c::transM(cM_rndFX(1.0f), cM_rndFX(1.0f), cM_rndFX(1.0f));
|
|
MTXCopy(mDoMtx_stack_c::get(), mTransformMtx);
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (CHECK_KLIFT_EXISTS(i)) {
|
|
Vec kLiftPos;
|
|
MTXMultVec(mNewBgMtx, &l_pos[i], &kLiftPos);
|
|
mDoMtx_stack_c::transS(kLiftPos.x, kLiftPos.y, kLiftPos.z);
|
|
MTXCopy(mDoMtx_stack_c::get(), mKLiftBaseMatrices[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
int daObjKWheel01_c::CreateHeap() {
|
|
J3DModelData* model_data = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_arcName, l_bmdidx[getOut()]));
|
|
JUT_ASSERT(229, model_data != NULL);
|
|
mpModel = mDoExt_J3DModel__create(model_data, (1 << 19), 0x11000084);
|
|
|
|
if (!mpModel) {
|
|
return 0;
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (!CHECK_KLIFT_EXISTS(i)) {
|
|
mKLiftCollisions[i] = NULL;
|
|
} else {
|
|
mKLiftCollisions[i] = new (dBgW);
|
|
|
|
if (!mKLiftCollisions[i]) {
|
|
return 0;
|
|
}
|
|
|
|
if (mKLiftCollisions[i]->Set(static_cast<cBgD_t*>(dComIfG_getObjectRes(l_arcName, l_dzbidx[1])), 1, &mKLiftBaseMatrices[i])) {
|
|
mKLiftCollisions[i] = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daObjKWheel01_c::Create() {
|
|
mpModel->setBaseTRMtx(mTransformMtx);
|
|
fopAcM_SetMtx(this, mTransformMtx);
|
|
|
|
if (getSwNo() != 0xFF && fopAcM_isSwitch(this, getSwNo())) {
|
|
#if DEBUG
|
|
if (getArg0()) {
|
|
mYAngularVelocity = l_HIO.mTargetYAngularSpeed;
|
|
} else {
|
|
mYAngularVelocity = -l_HIO.mTargetYAngularSpeed;
|
|
}
|
|
#else
|
|
if (getArg0()) {
|
|
mYAngularVelocity = 64;
|
|
} else {
|
|
mYAngularVelocity = -64;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
fopAcM_setCullSizeBox(this, l_cull_box.min.x, l_cull_box.min.y, l_cull_box.min.z, l_cull_box.max.x, l_cull_box.max.y, l_cull_box.max.z);
|
|
|
|
return 1;
|
|
}
|
|
|
|
static void* searchKWheel00(void* param_0, void* i_this) {
|
|
UNUSED(i_this);
|
|
if (param_0 && fopAcM_IsActor(param_0) && fopAcM_GetProfName(param_0) == PROC_Obj_KWheel00) {
|
|
daObjKWheel00_c* const kWheel00 = static_cast<daObjKWheel00_c*>(param_0);
|
|
if (kWheel00->getType() == daObjKWheel00_c::TYPE_LARGE_GOLD) {
|
|
return param_0;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
int daObjKWheel01_c::Execute(Mtx** i_mtx) {
|
|
eventUpdate();
|
|
|
|
if (getSwNo() == 0xFF) {
|
|
daObjKWheel00_c* const foundKWheel00 = static_cast<daObjKWheel00_c*>(fopAcM_Search(searchKWheel00, this));
|
|
if (foundKWheel00) {
|
|
if (getArg0()) {
|
|
ANGLE_ADD_2(current.angle.y, foundKWheel00->current.angle.z - foundKWheel00->old.angle.z);
|
|
} else {
|
|
ANGLE_SUB_2(current.angle.y, foundKWheel00->current.angle.z - foundKWheel00->old.angle.z);
|
|
}
|
|
|
|
shape_angle.y = current.angle.y;
|
|
|
|
if (current.angle.y != old.angle.y) {
|
|
#if DEBUG
|
|
mYAngularVelocity = l_HIO.mTargetYAngularSpeed;
|
|
#else
|
|
mYAngularVelocity = 64;
|
|
#endif
|
|
}
|
|
}
|
|
} else {
|
|
if (mYAngularVelocity == 0) {
|
|
if (fopAcM_isSwitch(this, getSwNo())) {
|
|
if (getEvent() != 0xFF) {
|
|
s16 eventIndex = (s16)dComIfGp_getEventManager().getEventIdx(this, getEvent());
|
|
setEvent(eventIndex, (u8)getEvent(), 1);
|
|
} else {
|
|
eventStart();
|
|
}
|
|
}
|
|
}
|
|
|
|
if (mYAngularVelocity != 0) {
|
|
#if DEBUG
|
|
if (mYAngularVelocity > 0) {
|
|
if (mYAngularVelocity < l_HIO.mTargetYAngularSpeed) {
|
|
mYAngularVelocity += l_HIO.mYAngularAcceleration;
|
|
}
|
|
} else if (mYAngularVelocity > -l_HIO.mTargetYAngularSpeed) {
|
|
mYAngularVelocity -= l_HIO.mYAngularAcceleration;
|
|
}
|
|
#else
|
|
if (mYAngularVelocity > 0) {
|
|
if (mYAngularVelocity < 64)
|
|
mYAngularVelocity += 2;
|
|
} else if (mYAngularVelocity > -64) {
|
|
mYAngularVelocity -= 2;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
current.angle.y += mYAngularVelocity;
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
setMtx();
|
|
mpModel->setBaseTRMtx(mTransformMtx);
|
|
*i_mtx = &mNewBgMtx;
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (CHECK_KLIFT_EXISTS(i)) {
|
|
daObjKLift00_c* const foundKLift = static_cast<daObjKLift00_c*>(fopAcM_SearchByID(m_klift_pid[i]));
|
|
|
|
if (foundKLift) {
|
|
cXyz kLiftOffset;
|
|
MTXMultVec(mNewBgMtx, &l_pos[i], &kLiftOffset);
|
|
|
|
foundKLift->current.pos = kLiftOffset;
|
|
foundKLift->shape_angle.y += mpBgW->GetDiffShapeAngleY();
|
|
foundKLift->home.angle.y += mpBgW->GetDiffShapeAngleY();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (CHECK_KLIFT_EXISTS(i)) {
|
|
mKLiftCollisions[i]->Move();
|
|
}
|
|
}
|
|
|
|
// Stack ordering issues arise if mDoAud_seStartLevel is used
|
|
if (mYAngularVelocity) {
|
|
Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_GEAR_LV, ¤t.pos, 0, 0, 1.0f, 1.0f, -1.0f,
|
|
-1.0f, 0);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daObjKWheel01_c::Draw() {
|
|
g_env_light.settingTevStruct(16, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
|
|
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
dComIfGd_setList();
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daObjKWheel01_c::Delete() {
|
|
dComIfG_resDelete(this, l_arcName);
|
|
|
|
#if DEBUG
|
|
l_HIO.removeHIO();
|
|
#endif
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
if (CHECK_KLIFT_EXISTS(i) && mKLiftCollisions[i] && mKLiftCollisions[i]->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mKLiftCollisions[i]);
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
bool daObjKWheel01_c::eventStart() {
|
|
#if DEBUG
|
|
if (getArg0()) {
|
|
mYAngularVelocity = l_HIO.mYAngularAcceleration;
|
|
} else {
|
|
mYAngularVelocity = -l_HIO.mYAngularAcceleration;
|
|
}
|
|
#else
|
|
if (getArg0()) {
|
|
mYAngularVelocity = 2;
|
|
} else {
|
|
mYAngularVelocity = -2;
|
|
}
|
|
#endif
|
|
|
|
return true;
|
|
}
|
|
|
|
static actor_method_class daObjKWheel01_METHODS = {
|
|
(process_method_func)daObjKWheel01_create1st,
|
|
(process_method_func)daObjKWheel01_MoveBGDelete,
|
|
(process_method_func)daObjKWheel01_MoveBGExecute,
|
|
0,
|
|
(process_method_func)daObjKWheel01_MoveBGDraw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_Obj_KWheel01 = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
3, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_KWheel01, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjKWheel01_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
663, // mPriority
|
|
&daObjKWheel01_METHODS, // sub_method
|
|
0x00040100, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|
|
|
|
static int daObjKWheel01_create1st(daObjKWheel01_c* i_this) {
|
|
fopAcM_ct(i_this, daObjKWheel01_c);
|
|
return i_this->create1st();
|
|
}
|
|
|
|
static int daObjKWheel01_MoveBGDelete(daObjKWheel01_c* i_this) {
|
|
return i_this->MoveBGDelete();
|
|
}
|
|
|
|
static int daObjKWheel01_MoveBGExecute(daObjKWheel01_c* i_this) {
|
|
return i_this->MoveBGExecute();
|
|
}
|
|
|
|
static int daObjKWheel01_MoveBGDraw(daObjKWheel01_c* i_this) {
|
|
return i_this->MoveBGDraw();
|
|
}
|