mirror of
https://github.com/zeldaret/tww.git
synced 2026-08-12 03:47:39 -04:00
486 lines
15 KiB
C++
486 lines
15 KiB
C++
/**
|
|
* d_a_obj_swheavy.cpp
|
|
* Object - Wind Temple - Iron Boots switch
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_obj_swheavy.h"
|
|
#include "res/Object/Hhbot.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/actor/d_a_player.h"
|
|
|
|
const char daObjSwheavy::Act_c::M_arcname[] = "Hhbot";
|
|
const daObjSwheavy::Attr_c daObjSwheavy::Act_c::M_attr[] = {
|
|
{
|
|
/* m00 */ {},
|
|
/* mFlags */ 0,
|
|
/* mVSpring */ 0.0f,
|
|
/* mVSpeedDecay */ 0.0f,
|
|
/* mPushVSpeed0 */ 0.0f,
|
|
/* m14 */ 0,
|
|
/* mMiniPushDelay */ 0,
|
|
/* mPushDelay */ 0,
|
|
},
|
|
{
|
|
/* m00 */ {},
|
|
/* mFlags */ 0,
|
|
/* mVSpring */ 0.0f,
|
|
/* mVSpeedDecay */ 0.0f,
|
|
/* mPushVSpeed0 */ 0.0f,
|
|
/* m14 */ 0,
|
|
/* mMiniPushDelay */ 0,
|
|
/* mPushDelay */ 0,
|
|
},
|
|
{
|
|
/* m00 */ {0,0,0x80,0},
|
|
/* mFlags */ FLAG_IS_TOGGLE | FLAG_REQ_HEAVY,
|
|
/* mVSpring */ 0.93f,
|
|
/* mVSpeedDecay */ 0.42f,
|
|
/* mPushVSpeed0 */ 0.0f,
|
|
/* m14 */ 4,
|
|
/* mMiniPushDelay */ 4,
|
|
/* mPushDelay */ 15,
|
|
},
|
|
{
|
|
/* m00 */ {0,0,0x80,0},
|
|
/* mFlags */ FLAG_OBEY_SAVE | FLAG_STAY_PRESSED | FLAG_REQ_HEAVY,
|
|
/* mVSpring */ 0.93f,
|
|
/* mVSpeedDecay */ 0.42f,
|
|
/* mPushVSpeed0 */ 0.0f,
|
|
/* m14 */ 4,
|
|
/* mMiniPushDelay */ 4,
|
|
/* mPushDelay */ 15,
|
|
},
|
|
};
|
|
|
|
/* 00000078-0000009C .text solidHeapCB__Q212daObjSwheavy5Act_cFP10fopAc_ac_c */
|
|
BOOL daObjSwheavy::Act_c::solidHeapCB(fopAc_ac_c* i_this) {
|
|
return static_cast<daObjSwheavy::Act_c*>(i_this)->create_heap();
|
|
}
|
|
|
|
/* 0000009C-0000032C .text create_heap__Q212daObjSwheavy5Act_cFv */
|
|
u8 daObjSwheavy::Act_c::create_heap() {
|
|
J3DModelData* mdl_1_data = (J3DModelData*) dComIfG_getObjectRes(M_arcname, dRes_INDEX_HHBOT_BDL_HHBOT1_e);
|
|
JUT_ASSERT(0x116, mdl_1_data != NULL);
|
|
mpModel1 = mDoExt_J3DModel__create(mdl_1_data, 0x80000, 0x11000022);
|
|
|
|
J3DModelData* mdl_2_data = (J3DModelData*) dComIfG_getObjectRes(M_arcname, dRes_INDEX_HHBOT_BDL_HHBOT2_e);
|
|
JUT_ASSERT(0x11F, mdl_2_data != NULL);
|
|
mpModel2 = mDoExt_J3DModel__create(mdl_2_data, 0x80000, 0x11000022);
|
|
|
|
bool b1 = false;
|
|
mpBgW1 = new dBgW();
|
|
if (mpBgW1 != NULL) {
|
|
cBgD_t* bgw_1_data = (cBgD_t*) dComIfG_getObjectRes(M_arcname, dRes_INDEX_HHBOT_DZB_HHBOT1_e);
|
|
JUT_ASSERT(0x137, bgw_1_data != NULL);
|
|
if (!mpBgW1->Set(bgw_1_data, dBgW::MOVE_BG_e, &mMtx1)) {
|
|
b1 = true;
|
|
}
|
|
}
|
|
|
|
bool b2 = false;
|
|
mpBgW2 = new dBgW();
|
|
if (mpBgW2 != NULL) {
|
|
cBgD_t* bgw_2_data = (cBgD_t*) dComIfG_getObjectRes(M_arcname, dRes_INDEX_HHBOT_DZB_HHBOT2_e);
|
|
JUT_ASSERT(0x146, bgw_2_data != NULL);
|
|
if (!mpBgW2->Set(bgw_2_data, dBgW::MOVE_BG_e, &mMtx2)) {
|
|
b2 = true;
|
|
}
|
|
}
|
|
|
|
bool success = false;
|
|
if (mpModel1 && mpModel2 && b1 && b2) {
|
|
success = true;
|
|
}
|
|
|
|
if (!success) {
|
|
mpBgW1 = NULL;
|
|
mpBgW2 = NULL;
|
|
}
|
|
// Fakematch? This function should probably have return type bool, but the codegen towards the
|
|
// end here doesn't work unless the return type is u8.
|
|
return success;
|
|
}
|
|
|
|
/* 0000032C-00000628 .text _create__Q212daObjSwheavy5Act_cFv */
|
|
cPhs_State daObjSwheavy::Act_c::_create() {
|
|
fopAcM_ct(this, daObjSwheavy::Act_c);
|
|
|
|
cPhs_State phase_state = dComIfG_resLoad(&mPhs, M_arcname);
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
mType = prm_get_type();
|
|
bool up = cLib_checkBit<u32>(attr().mFlags, FLAG_IS_TOGGLE) || !is_switch();
|
|
scale.z *= 1.5f;
|
|
scale.x *= 1.5f;
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(scale);
|
|
mDoMtx_copy(mDoMtx_stack_c::get(), mMtx1);
|
|
if (!up) {
|
|
mDoMtx_stack_c::get()[1][3] += -35.5f;
|
|
}
|
|
mDoMtx_copy(mDoMtx_stack_c::get(), mMtx2);
|
|
if (fopAcM_entrySolidHeap(this, solidHeapCB, 0x2000)) {
|
|
dComIfG_Bgsp()->Regist(mpBgW1, this);
|
|
mpBgW1->SetCrrFunc(NULL);
|
|
dComIfG_Bgsp()->Regist(mpBgW2, this);
|
|
mpBgW2->SetCrrFunc(NULL);
|
|
mpBgW2->SetRideCallback(rideCB);
|
|
fopAcM_SetMtx(this, mpModel1->getBaseTRMtx());
|
|
init_mtx();
|
|
fopAcM_setCullSizeBox(this, -97.5f, -2.0f, -97.5f, 97.5f, 55.0f, 97.5f);
|
|
mRiding = false;
|
|
mPrevRiding = false;
|
|
mMiniPushTimer = 0;
|
|
mMiniPushFlg = false;
|
|
mHeavyRiding = false;
|
|
mPrevHeavyRiding = false;
|
|
mPushTimer = 0;
|
|
mPushFlg = false;
|
|
mVSpeed = 0.0f;
|
|
m330 = 0;
|
|
m334 = 0.0f;
|
|
if (cLib_checkBit<u32>(attr().mFlags, FLAG_IS_TOGGLE) || !is_switch()) {
|
|
mTargetHFrac = 1.0f;
|
|
mCurHFrac = 1.0f;
|
|
m328 = 0.0f;
|
|
m32C = 1.0f;
|
|
m338 = 1.0f;
|
|
mTopPos = 0.0f;
|
|
mode_upper_init();
|
|
} else {
|
|
mTargetHFrac = 0.0f;
|
|
mCurHFrac = 0.0f;
|
|
m328 = -35.5f;
|
|
m32C = 0.0f;
|
|
m338 = 0.0f;
|
|
mTopPos = -35.5f;
|
|
mode_lower_init();
|
|
}
|
|
} else {
|
|
phase_state = cPhs_ERROR_e;
|
|
}
|
|
}
|
|
return phase_state;
|
|
}
|
|
|
|
/* 00000628-000006EC .text _delete__Q212daObjSwheavy5Act_cFv */
|
|
bool daObjSwheavy::Act_c::_delete() {
|
|
if (mpBgW1) {
|
|
if (mpBgW1->ChkUsed()) {
|
|
dComIfG_Bgsp()->Release(mpBgW1);
|
|
}
|
|
}
|
|
if (mpBgW2) {
|
|
if (mpBgW2->ChkUsed()) {
|
|
dComIfG_Bgsp()->Release(mpBgW2);
|
|
}
|
|
}
|
|
dComIfG_resDelete(&mPhs, M_arcname);
|
|
return true;
|
|
}
|
|
|
|
/* 000006EC-000007F8 .text set_mtx__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::set_mtx() {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mpModel1->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mDoMtx_stack_c::get()[1][3] += m328;
|
|
mpModel2->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(scale);
|
|
mDoMtx_copy(mDoMtx_stack_c::get(), mMtx1);
|
|
mDoMtx_stack_c::get()[1][3] += mTopPos;
|
|
mDoMtx_copy(mDoMtx_stack_c::get(), mMtx2);
|
|
}
|
|
|
|
/* 000007F8-00000850 .text init_mtx__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::init_mtx() {
|
|
mpModel1->setBaseScale(scale);
|
|
mpModel2->setBaseScale(scale);
|
|
set_mtx();
|
|
}
|
|
|
|
/* 00000850-00000884 .text rideCB__Q212daObjSwheavy5Act_cFP4dBgWP10fopAc_ac_cP10fopAc_ac_c */
|
|
void daObjSwheavy::Act_c::rideCB(dBgW* bgw, fopAc_ac_c* i_ac, fopAc_ac_c* i_pt) {
|
|
daObjSwheavy::Act_c *i_this = (daObjSwheavy::Act_c*)i_ac;
|
|
if (fopAcM_CheckStatus(i_pt, fopAcStts_FREEZE_e)) {
|
|
i_this->mRiding = true;
|
|
|
|
if (fopAcM_GetProfName(i_pt) == fpcNm_PLAYER_e && ((daPy_py_c*)i_pt)->checkEquipHeavyBoots()) {
|
|
i_this->mHeavyRiding = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00000884-00000998 .text calc_top_pos__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::calc_top_pos() {
|
|
float decay = attr().mVSpeedDecay;
|
|
mVSpeed -= (mCurHFrac - mTargetHFrac) * attr().mVSpring;
|
|
mVSpeed -= mVSpeed * decay;
|
|
mCurHFrac += mVSpeed;
|
|
m328 = (1.0f - mCurHFrac) * -35.5f;
|
|
m328 = cLib_minMaxLimit(m328, -36.5f, 1.0f);
|
|
|
|
if (m330 > 0) {
|
|
if (--m330 == 0) {
|
|
m32C = m334;
|
|
}
|
|
}
|
|
if (mMode == 0) {
|
|
m338 = mCurHFrac;
|
|
} else {
|
|
m338 = m32C;
|
|
}
|
|
mTopPos = (1.0f - m338) * -35.5f;
|
|
if (mTopPos < m328) {
|
|
mTopPos = m328;
|
|
}
|
|
}
|
|
|
|
/* 00000998-000009A4 .text top_bg_aim_req__Q212daObjSwheavy5Act_cFfs */
|
|
void daObjSwheavy::Act_c::top_bg_aim_req(float param_1, short param_2) {
|
|
m334 = param_1;
|
|
m330 = param_2;
|
|
}
|
|
|
|
/* 000009A4-00000AF8 .text set_push_flag__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::set_push_flag() {
|
|
if (mMiniPushFlg) {
|
|
if (mRiding) {
|
|
mMiniPushTimer = attr().mMiniPushDelay;
|
|
} else {
|
|
if (--mMiniPushTimer <= 0) {
|
|
mMiniPushFlg = false;
|
|
}
|
|
}
|
|
} else {
|
|
if (mRiding) {
|
|
if (++mMiniPushTimer >= attr().mMiniPushDelay) {
|
|
mMiniPushFlg = true;
|
|
}
|
|
} else {
|
|
mMiniPushTimer = 0;
|
|
}
|
|
}
|
|
|
|
if (mPushFlg) {
|
|
if (mHeavyRiding) {
|
|
mPushTimer = attr().mPushDelay;
|
|
} else {
|
|
if (--mPushTimer <= 0) {
|
|
mPushFlg = false;
|
|
}
|
|
}
|
|
} else {
|
|
if (mHeavyRiding) {
|
|
if (++mPushTimer >= attr().mPushDelay) {
|
|
mPushFlg = true;
|
|
}
|
|
} else {
|
|
mPushTimer = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00000AF8-00000B14 .text mode_upper_init__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_upper_init() {
|
|
mMode = 0;
|
|
mTargetHFrac = 1.0f;
|
|
mChangingState = false;
|
|
}
|
|
|
|
/* 00000B14-00000C30 .text mode_upper__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_upper() {
|
|
bool pressing = false;
|
|
float height = 1.0f;
|
|
if (mMiniPushFlg) {
|
|
if (cLib_checkBit<u32>(attr().mFlags, FLAG_REQ_HEAVY)) {
|
|
if (mPushFlg) {
|
|
pressing = true;
|
|
} else {
|
|
height = 0.9f;
|
|
}
|
|
} else {
|
|
pressing = true;
|
|
}
|
|
}
|
|
|
|
if (pressing || (cLib_checkBit<u32>(attr().mFlags, FLAG_OBEY_SAVE) && is_switch())) {
|
|
if (pressing) {
|
|
mChangingState = true;
|
|
}
|
|
mode_u_l_init();
|
|
} else {
|
|
mTargetHFrac = height;
|
|
top_bg_aim_req(height, 1);
|
|
}
|
|
}
|
|
|
|
/* 00000C30-00000C90 .text mode_u_l_init__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_u_l_init() {
|
|
mMode = 1;
|
|
mTargetHFrac = 0.0f;
|
|
mVSpeed = attr().mPushVSpeed0;
|
|
top_bg_aim_req(0.0f, attr().m14);
|
|
}
|
|
|
|
/* 00000C90-00000D98 .text mode_u_l__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_u_l() {
|
|
if (mCurHFrac <= 0.0f) {
|
|
if (mChangingState) {
|
|
if (cLib_checkBit<u32>(attr().mFlags, FLAG_IS_TOGGLE)) {
|
|
rev_switch();
|
|
} else {
|
|
on_switch();
|
|
}
|
|
}
|
|
fopAcM_seStart(this, JA_SE_OBJ_FOOT_SW_ON, 0);
|
|
mode_lower_init();
|
|
}
|
|
}
|
|
|
|
/* 00000D98-00000DB8 .text mode_lower_init__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_lower_init() {
|
|
mMode = 2;
|
|
mTargetHFrac = 0.0f;
|
|
mChangingState = false;
|
|
}
|
|
|
|
/* 00000DB8-00000F0C .text mode_lower__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_lower() {
|
|
bool pressing = false;
|
|
if (mMiniPushFlg) {
|
|
if (cLib_checkBit<u32>(attr().mFlags, FLAG_REQ_HEAVY)) {
|
|
if (mPushFlg) {
|
|
pressing = true;
|
|
}
|
|
} else {
|
|
pressing = true;
|
|
}
|
|
}
|
|
|
|
bool pop_back_up = !cLib_checkBit<u32>(attr().mFlags, FLAG_STAY_PRESSED) &&
|
|
!pressing;
|
|
bool match_state_up = cLib_checkBit<u32>(attr().mFlags, FLAG_OBEY_SAVE) &&
|
|
!is_switch() &&
|
|
!pressing;
|
|
|
|
if (pop_back_up || match_state_up) {
|
|
bool is_toggle = cLib_checkBit<u32>(attr().mFlags, FLAG_IS_TOGGLE);
|
|
if (pop_back_up && !is_toggle && !pressing) {
|
|
mChangingState = true;
|
|
}
|
|
mode_l_u_init();
|
|
}
|
|
}
|
|
|
|
/* 00000F0C-00000F44 .text mode_l_u_init__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_l_u_init() {
|
|
mMode = 3;
|
|
mTargetHFrac = 1.0f;
|
|
top_bg_aim_req(1.0f, 1);
|
|
}
|
|
|
|
/* 00000F44-00000FBC .text mode_l_u__Q212daObjSwheavy5Act_cFv */
|
|
void daObjSwheavy::Act_c::mode_l_u() {
|
|
if (mCurHFrac >= 1.0f) {
|
|
if (mChangingState) {
|
|
off_switch();
|
|
}
|
|
mode_upper_init();
|
|
}
|
|
}
|
|
|
|
/* 00000FBC-00001104 .text _execute__Q212daObjSwheavy5Act_cFv */
|
|
bool daObjSwheavy::Act_c::_execute() {
|
|
typedef void (daObjSwheavy::Act_c::*procFunc)();
|
|
static procFunc mode_proc[] = {
|
|
&daObjSwheavy::Act_c::mode_upper,
|
|
&daObjSwheavy::Act_c::mode_u_l,
|
|
&daObjSwheavy::Act_c::mode_lower,
|
|
&daObjSwheavy::Act_c::mode_l_u,
|
|
};
|
|
set_push_flag();
|
|
(this->*mode_proc[mMode])();
|
|
calc_top_pos();
|
|
mPrevRiding = mRiding;
|
|
mPrevHeavyRiding = mHeavyRiding;
|
|
mRiding = false;
|
|
mHeavyRiding = false;
|
|
set_mtx();
|
|
mpBgW1->Move();
|
|
mpBgW2->Move();
|
|
eyePos.x = current.pos.x;
|
|
eyePos.y = current.pos.y + m328 - -35.5f;
|
|
eyePos.z = current.pos.z;
|
|
return true;
|
|
}
|
|
|
|
/* 00001104-000011C0 .text _draw__Q212daObjSwheavy5Act_cFv */
|
|
bool daObjSwheavy::Act_c::_draw() {
|
|
g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType(mpModel1, &tevStr);
|
|
g_env_light.setLightTevColorType(mpModel2, &tevStr);
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mpModel1);
|
|
mDoExt_modelUpdateDL(mpModel2);
|
|
dComIfGd_setList();
|
|
return true;
|
|
}
|
|
|
|
namespace daObjSwheavy {
|
|
namespace {
|
|
/* 000011C0-000011E0 .text Mthd_Create__Q212daObjSwheavy29@unnamed@d_a_obj_swheavy_cpp@FPv */
|
|
cPhs_State Mthd_Create(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->_create();
|
|
}
|
|
|
|
/* 000011E0-00001204 .text Mthd_Delete__Q212daObjSwheavy29@unnamed@d_a_obj_swheavy_cpp@FPv */
|
|
BOOL Mthd_Delete(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->_delete();
|
|
}
|
|
|
|
/* 00001204-00001228 .text Mthd_Execute__Q212daObjSwheavy29@unnamed@d_a_obj_swheavy_cpp@FPv */
|
|
BOOL Mthd_Execute(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->_execute();
|
|
}
|
|
|
|
/* 00001228-0000124C .text Mthd_Draw__Q212daObjSwheavy29@unnamed@d_a_obj_swheavy_cpp@FPv */
|
|
BOOL Mthd_Draw(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->_draw();
|
|
}
|
|
|
|
/* 0000124C-00001254 .text Mthd_IsDelete__Q212daObjSwheavy29@unnamed@d_a_obj_swheavy_cpp@FPv */
|
|
BOOL Mthd_IsDelete(void* i_this) {
|
|
return TRUE;
|
|
}
|
|
|
|
static actor_method_class Mthd_Table = {
|
|
(process_method_func)Mthd_Create,
|
|
(process_method_func)Mthd_Delete,
|
|
(process_method_func)Mthd_Execute,
|
|
(process_method_func)Mthd_IsDelete,
|
|
(process_method_func)Mthd_Draw,
|
|
};
|
|
}; // namespace
|
|
}; // namespace daObjSwheavy
|
|
|
|
actor_process_profile_definition g_profile_Obj_Swheavy = {
|
|
/* Layer ID */ fpcLy_CURRENT_e,
|
|
/* List ID */ 0x0002,
|
|
/* List Prio */ fpcPi_CURRENT_e,
|
|
/* Proc Name */ fpcNm_Obj_Swheavy_e,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daObjSwheavy::Act_c),
|
|
/* Size Other */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Draw Prio */ fpcDwPi_Obj_Swheavy_e,
|
|
/* Actor SubMtd */ &daObjSwheavy::Mthd_Table,
|
|
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e,
|
|
/* Group */ fopAc_ACTOR_e,
|
|
/* Cull Type */ fopAc_CULLBOX_CUSTOM_e,
|
|
};
|