diff --git a/config/GZ2J01/rels/d_a_obj_lv6swturn/splits.txt b/config/GZ2J01/rels/d_a_obj_lv6swturn/splits.txt index c92972380ef..7508ab4c048 100644 --- a/config/GZ2J01/rels/d_a_obj_lv6swturn/splits.txt +++ b/config/GZ2J01/rels/d_a_obj_lv6swturn/splits.txt @@ -13,3 +13,4 @@ d/actor/d_a_obj_lv6swturn.cpp: .text start:0x00000078 end:0x00000D7C .rodata start:0x00000000 end:0x0000002C .data start:0x00000000 end:0x000000CC + .bss start:0x00000000 end:0x00000004 diff --git a/config/GZ2P01/rels/d_a_obj_lv6swturn/splits.txt b/config/GZ2P01/rels/d_a_obj_lv6swturn/splits.txt index c92972380ef..7508ab4c048 100644 --- a/config/GZ2P01/rels/d_a_obj_lv6swturn/splits.txt +++ b/config/GZ2P01/rels/d_a_obj_lv6swturn/splits.txt @@ -13,3 +13,4 @@ d/actor/d_a_obj_lv6swturn.cpp: .text start:0x00000078 end:0x00000D7C .rodata start:0x00000000 end:0x0000002C .data start:0x00000000 end:0x000000CC + .bss start:0x00000000 end:0x00000004 diff --git a/configure.py b/configure.py index dcb215aae41..f8d9d6e4a7e 100755 --- a/configure.py +++ b/configure.py @@ -2095,7 +2095,7 @@ config.libs = [ ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_lv6bemos2"), ActorRel(NonMatching, "d_a_obj_lv6egate"), ActorRel(NonMatching, "d_a_obj_lv6elevta"), - ActorRel(NonMatching, "d_a_obj_lv6swturn"), + ActorRel(MatchingFor("GZ2E01", "GZ2P01", "GZ2J01"), "d_a_obj_lv6swturn"), ActorRel(NonMatching, "d_a_obj_lv7BsGate"), ActorRel(NonMatching, "d_a_obj_lv7PropellerY"), ActorRel(NonMatching, "d_a_obj_lv7bridge"), diff --git a/include/d/actor/d_a_obj_lv6swturn.h b/include/d/actor/d_a_obj_lv6swturn.h index 5a687046ee5..7bc36ef55e3 100644 --- a/include/d/actor/d_a_obj_lv6swturn.h +++ b/include/d/actor/d_a_obj_lv6swturn.h @@ -2,6 +2,7 @@ #define D_A_OBJ_LV6SWTURN_H #include "f_op/f_op_actor_mng.h" +#include "d/d_bg_s_movebg_actor.h" /** * @ingroup actors-objects @@ -11,27 +12,57 @@ * @details * */ -class daObjLv6SwTurn_c : public fopAc_ac_c { +class daObjLv6SwTurn_c : public dBgS_MoveBgActor { public: /* 80C83A98 */ void initBaseMtx(); /* 80C83AD4 */ void setBaseMtx(); - /* 80C83B38 */ void Create(); - /* 80C83C10 */ void CreateHeap(); - /* 80C83C80 */ void create1st(); - /* 80C83D04 */ void Execute(Mtx**); + /* 80C83B38 */ int Create(); + /* 80C83C10 */ int CreateHeap(); + /* 80C83C80 */ int create1st(); + /* 80C83D04 */ int Execute(Mtx**); /* 80C83D94 */ void mode_proc_call(); /* 80C83E20 */ void init_modeWait(); /* 80C83E58 */ void modeWait(); /* 80C84238 */ void init_modeRotate(); /* 80C8425C */ void modeRotate(); - /* 80C844F8 */ void Draw(); - /* 80C8459C */ void Delete(); + /* 80C844F8 */ int Draw(); + /* 80C8459C */ int Delete(); -private: - /* 0x568 */ u8 field_0x568[0x5cc - 0x568]; + u8 getSwbit() { return fopAcM_GetParamBit((void*)this, 0, 8); }; + u8 getSwbit2() { return fopAcM_GetParamBit((void*)this, 8, 8); }; + + /* 0x5A0 */ request_of_phase_process_class unk5A0; + /* 0x5A8 */ J3DModel* unk5A8; + /* 0x5AC */ u8 mMode; + /* 0x5AD */ u8 unk5AD; + /* 0x5AE */ u8 unk5AE[2]; + /* 0x5B0 */ s16 unk5B0; + /* 0x5B2 */ s16 unk5B2; + /* 0x5B4 */ s16 unk5B4; + /* 0x5B6 */ s16 unk5B6; + /* 0x5B8 */ int unk5B8; + /* 0x5BC */ s8 unk5BC; + /* 0x5BD */ u8 unk5BD; + /* 0x5C0 */ u32 unk5C0; + /* 0x5C4 */ dBgW_Base::PushPullLabel unk5C4; + /* 0x5C8 */ s16 unk5C8; + /* 0x5CA */ s16 unk5CA; }; STATIC_ASSERT(sizeof(daObjLv6SwTurn_c) == 0x5cc); +#ifdef DEBUG +class daObjLv6SwTurn_HIO_c : public mDoHIO_entry_c { +public: + daObjLv6SwTurn_HIO_c(); + void genMessage(JORMContext*); + + /* 0x6 */ u8 mWaitTime; + /* 0x7 */ u8 mChargeTime; + /* 0x8 */ s16 mRotationTime; + /* 0xA */ u8 unkA; + /* 0xB */ u8 mDrawFlag; +}; +#endif #endif /* D_A_OBJ_LV6SWTURN_H */ diff --git a/src/d/actor/d_a_obj_lv6swturn.cpp b/src/d/actor/d_a_obj_lv6swturn.cpp index 02e91eaa0dd..4827d7c76ab 100644 --- a/src/d/actor/d_a_obj_lv6swturn.cpp +++ b/src/d/actor/d_a_obj_lv6swturn.cpp @@ -1,321 +1,400 @@ /** * @file d_a_obj_lv6swturn.cpp - * -*/ + * + */ + + #include "d/dolzel_rel.h" // IWYU pragma: keep +#include "d/d_s_play.h" -#include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_lv6swturn.h" -#include "dol2asm.h" +#include "d/actor/d_a_player.h" +#if DEBUG +daObjLv6SwTurn_HIO_c::daObjLv6SwTurn_HIO_c() { + mWaitTime = 0x2f; + mChargeTime = 0x23; + mRotationTime = 0x5a; + unkA = 0x0; + mDrawFlag = 0x0; +} - -// -// Forward References: -// - -extern "C" static void PPCallBack__FP10fopAc_ac_cP10fopAc_ac_csQ29dBgW_Base13PushPullLabel(); -extern "C" void initBaseMtx__16daObjLv6SwTurn_cFv(); -extern "C" void setBaseMtx__16daObjLv6SwTurn_cFv(); -extern "C" void Create__16daObjLv6SwTurn_cFv(); -extern "C" void CreateHeap__16daObjLv6SwTurn_cFv(); -extern "C" void create1st__16daObjLv6SwTurn_cFv(); -extern "C" void Execute__16daObjLv6SwTurn_cFPPA3_A4_f(); -extern "C" void mode_proc_call__16daObjLv6SwTurn_cFv(); -extern "C" void init_modeWait__16daObjLv6SwTurn_cFv(); -extern "C" void modeWait__16daObjLv6SwTurn_cFv(); -extern "C" void init_modeRotate__16daObjLv6SwTurn_cFv(); -extern "C" void modeRotate__16daObjLv6SwTurn_cFv(); -extern "C" void Draw__16daObjLv6SwTurn_cFv(); -extern "C" void Delete__16daObjLv6SwTurn_cFv(); -extern "C" static void daObjLv6SwTurn_create1st__FP16daObjLv6SwTurn_c(); -extern "C" static void daObjLv6SwTurn_MoveBGDelete__FP16daObjLv6SwTurn_c(); -extern "C" static void daObjLv6SwTurn_MoveBGExecute__FP16daObjLv6SwTurn_c(); -extern "C" static void daObjLv6SwTurn_MoveBGDraw__FP16daObjLv6SwTurn_c(); -extern "C" extern char const* const d_a_obj_lv6swturn__stringBase0; - -// -// External References: -// - -extern "C" void mDoMtx_YrotS__FPA4_fs(); -extern "C" void mDoMtx_YrotM__FPA4_fs(); -extern "C" void transS__14mDoMtx_stack_cFRC4cXyz(); -extern "C" void mDoExt_modelUpdateDL__FP8J3DModel(); -extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); -extern "C" void fopAcM_setCullSizeBox2__FP10fopAc_ac_cP12J3DModelData(); -extern "C" void dComIfG_resLoad__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfG_resDelete__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfGp_getReverb__Fi(); -extern "C" void onSwitch__10dSv_info_cFii(); -extern "C" void offSwitch__10dSv_info_cFii(); -extern "C" void isSwitch__10dSv_info_cCFii(); -extern "C" void getRes__14dRes_control_cFPCclP11dRes_info_ci(); -extern "C" void StartShock__12dVibration_cFii4cXyz(); -extern "C" void dBgS_MoveBGProc_TypicalRotY__FP4dBgWPvRC13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz(); -extern "C" void __ct__16dBgS_MoveBgActorFv(); -extern "C" bool IsDelete__16dBgS_MoveBgActorFv(); -extern "C" bool ToFore__16dBgS_MoveBgActorFv(); -extern "C" bool ToBack__16dBgS_MoveBgActorFv(); -extern "C" void -MoveBGCreate__16dBgS_MoveBgActorFPCciPFP4dBgWPvRC13cBgS_PolyInfobP4cXyzP5csXyzP5csXyz_vUlPA3_A4_f(); -extern "C" void MoveBGDelete__16dBgS_MoveBgActorFv(); -extern "C" void MoveBGExecute__16dBgS_MoveBgActorFv(); -extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); -extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); -extern "C" void __mi__4cXyzCFRC3Vec(); -extern "C" void cLib_addCalcAngleS__FPsssss(); -extern "C" void cLib_addCalcAngleS2__FPssss(); -extern "C" void seStart__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); -extern "C" void seStartLevel__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); -extern "C" void __ptmf_scall(); -extern "C" void _savegpr_27(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_27(); -extern "C" void _restgpr_29(); -extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" u8 sincosTable___5JMath[65536]; -extern "C" u8 mAudioMgrPtr__10Z2AudioMgr[4 + 4 /* padding */]; -extern "C" extern u8 data_80C847A0[4]; - -// -// Declarations: -// - -/* ############################################################################################## */ -/* 80C846A4-80C846A8 000000 0004+00 3/3 0/0 0/0 .rodata @3695 */ -SECTION_RODATA static u8 const lit_3695[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x80C846A4, &lit_3695); +void daObjLv6SwTurn_HIO_c::genMessage(JORMContext* context) { + context->genLabel("Lv6回転スイッチ", 0, 0, NULL, -1, -1, 0x200, 0x18); + context->genSlider("タメ時間(初回)", &mWaitTime, 0, 100, 0, NULL, -1, -1, 0x200, 0x18); + context->genSlider("タメ時間(連続)", &mChargeTime, 0, 100, 0, NULL, -1, -1, 0x200, 0x18); + context->genSlider("回転時間", &mRotationTime, 0, 500, 0, NULL, -1, -1, 0x200, 0x18); + context->genCheckBox("チェック描画", &mDrawFlag, 1, 0, NULL, -1, -1, 0x200, 0x18); +} +#endif /* 80C83998-80C83A98 000078 0100+00 1/1 0/0 0/0 .text * PPCallBack__FP10fopAc_ac_cP10fopAc_ac_csQ29dBgW_Base13PushPullLabel */ -static void PPCallBack(fopAc_ac_c* param_0, fopAc_ac_c* param_1, s16 param_2, - dBgW_Base::PushPullLabel param_3) { - // NONMATCHING +static fopAc_ac_c* PPCallBack(fopAc_ac_c* actor1, fopAc_ac_c* actor2, s16 param_2, + dBgW_Base::PushPullLabel pushPull) { + (void)param_2; // needed to match debug + dBgW_Base::PushPullLabel pushPull_3 = cLib_checkBit(pushPull, dBgW_Base::PPLABEL_3); + daObjLv6SwTurn_c* swTurnActor1 = (daObjLv6SwTurn_c*)actor1; + daObjLv6SwTurn_c* swTurnActor2 = (daObjLv6SwTurn_c*)actor2; + if (pushPull_3 != dBgW_Base::PPLABEL_NONE) { + cXyz posVec = swTurnActor2->current.pos - swTurnActor1->current.pos; + mDoMtx_stack_c::YrotS(-swTurnActor1->shape_angle.y); + mDoMtx_stack_c::multVec(&posVec, &posVec); + int ind; + if (posVec.z > 0.0f) { + ind = cLib_checkBit(pushPull_3, dBgW_Base::PPLABEL_PULL) ? 0 : 1; + } else { + ind = cLib_checkBit(pushPull_3, dBgW_Base::PPLABEL_PULL) ? 1 : 0; + } + for (int i = 0; i < 2; i++) { + if (i == ind) { + swTurnActor1->unk5AE[i]++; + } else { + swTurnActor1->unk5AE[i] = 0; + } + } + swTurnActor1->unk5AD = 1; + swTurnActor1->unk5C4 = pushPull; + } + return actor1; } +/* 80C846F0-80C846F4 -00001 0004+00 3/3 0/0 0/0 .data l_arcName */ +static char* l_arcName = "Obj_l6tsw"; + /* 80C83A98-80C83AD4 000178 003C+00 1/1 0/0 0/0 .text initBaseMtx__16daObjLv6SwTurn_cFv */ void daObjLv6SwTurn_c::initBaseMtx() { - // NONMATCHING + unk5A8->setBaseScale(scale); + setBaseMtx(); } /* 80C83AD4-80C83B38 0001B4 0064+00 2/2 0/0 0/0 .text setBaseMtx__16daObjLv6SwTurn_cFv */ void daObjLv6SwTurn_c::setBaseMtx() { - // NONMATCHING + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + unk5A8->setBaseTRMtx(mDoMtx_stack_c::get()); + MTXCopy(mDoMtx_stack_c::get(), mBgMtx); } /* 80C83B38-80C83C10 000218 00D8+00 1/0 0/0 0/0 .text Create__16daObjLv6SwTurn_cFv */ -void daObjLv6SwTurn_c::Create() { - // NONMATCHING +int daObjLv6SwTurn_c::Create() { + if (fopAcM_isSwitch(this, getSwbit())) { + unk5BC = 1; + } else if (fopAcM_isSwitch(this, getSwbit2())) { + unk5BC = -1; + } else { + unk5BC = 0; + } + fopAcM_SetMtx(this, unk5A8->getBaseTRMtx()); + fopAcM_setCullSizeBox2(this, unk5A8->getModelData()); + mpBgW->SetPushPullCallback(PPCallBack); + init_modeWait(); + MoveBGExecute(); + initBaseMtx(); + return TRUE; } -/* ############################################################################################## */ -/* 80C846C4-80C846C4 000020 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_80C846C4 = "Obj_l6tsw"; -#pragma pop - -/* 80C846F0-80C846F4 -00001 0004+00 3/3 0/0 0/0 .data l_arcName */ -SECTION_DATA static void* l_arcName = (void*)&d_a_obj_lv6swturn__stringBase0; /* 80C83C10-80C83C80 0002F0 0070+00 1/0 0/0 0/0 .text CreateHeap__16daObjLv6SwTurn_cFv */ -void daObjLv6SwTurn_c::CreateHeap() { - // NONMATCHING +int daObjLv6SwTurn_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, 4); + JUT_ASSERT(268, modelData != NULL); + unk5A8 = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); + if (unk5A8 == NULL) { + return FALSE; + } + return TRUE; } +#ifdef DEBUG +static daObjLv6SwTurn_HIO_c l_HIO; +#endif + /* 80C83C80-80C83D04 000360 0084+00 1/1 0/0 0/0 .text create1st__16daObjLv6SwTurn_cFv */ -void daObjLv6SwTurn_c::create1st() { - // NONMATCHING +int daObjLv6SwTurn_c::create1st() { + int step = dComIfG_resLoad(&unk5A0, l_arcName); + if (step == cPhs_COMPLEATE_e) { + step = MoveBGCreate(l_arcName, 7, dBgS_MoveBGProc_TypicalRotY, 0x1800, 0); + if (step == cPhs_ERROR_e) { + return step; + } +#if DEBUG + l_HIO.entryHIO("Lv6回転スイッチ"); +#endif + } + return step; } /* 80C83D04-80C83D94 0003E4 0090+00 1/0 0/0 0/0 .text Execute__16daObjLv6SwTurn_cFPPA3_A4_f */ -void daObjLv6SwTurn_c::Execute(Mtx** param_0) { - // NONMATCHING +int daObjLv6SwTurn_c::Execute(Mtx** i_pMtx) { + unk5C0++; + mode_proc_call(); + *i_pMtx = &mBgMtx; + setBaseMtx(); + eyePos = current.pos; + attention_info.position = current.pos; + unk5AD = 0; + return TRUE; } -/* ############################################################################################## */ -/* 80C846F4-80C84700 -00001 000C+00 0/1 0/0 0/0 .data @3777 */ -#pragma push -#pragma force_active on -SECTION_DATA static void* lit_3777[3] = { - (void*)NULL, - (void*)0xFFFFFFFF, - (void*)modeWait__16daObjLv6SwTurn_cFv, -}; -#pragma pop - -/* 80C84700-80C8470C -00001 000C+00 0/1 0/0 0/0 .data @3778 */ -#pragma push -#pragma force_active on -SECTION_DATA static void* lit_3778[3] = { - (void*)NULL, - (void*)0xFFFFFFFF, - (void*)modeRotate__16daObjLv6SwTurn_cFv, -}; -#pragma pop - -/* 80C8470C-80C84724 00003C 0018+00 0/1 0/0 0/0 .data l_func$3776 */ -#pragma push -#pragma force_active on -SECTION_DATA static u8 l_func[24] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -#pragma pop - /* 80C83D94-80C83E20 000474 008C+00 1/1 0/0 0/0 .text mode_proc_call__16daObjLv6SwTurn_cFv */ +enum daObjLv6SwTurn_c_mode{ + DAOBJLV6SWTURN_C_MODE_WAIT, + DAOBJLV6SWTURN_C_MODE_ROTATE, +}; + void daObjLv6SwTurn_c::mode_proc_call() { - // NONMATCHING + typedef void (daObjLv6SwTurn_c::*func_type)(); + // naming difference between debug and release +#if DEBUG + static func_type mode_proc_call[] = { + &daObjLv6SwTurn_c::modeWait, + &daObjLv6SwTurn_c::modeRotate + }; + (this->*mode_proc_call[mMode])(); +#else + static func_type l_func[] = { + &daObjLv6SwTurn_c::modeWait, + &daObjLv6SwTurn_c::modeRotate + }; + (this->*l_func[mMode])(); +#endif } /* 80C83E20-80C83E58 000500 0038+00 2/2 0/0 0/0 .text init_modeWait__16daObjLv6SwTurn_cFv */ void daObjLv6SwTurn_c::init_modeWait() { - // NONMATCHING + unk5B2 = 0; + unk5B8 = -1; + for (int i = 0; i < 2; i++) { + unk5AE[i] = 0; + } + mMode = DAOBJLV6SWTURN_C_MODE_WAIT; } -/* ############################################################################################## */ -/* 80C846A8-80C846AC 000004 0004+00 0/2 0/0 0/0 .rodata @3960 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3960 = 1.0f; -COMPILER_STRIP_GATE(0x80C846A8, &lit_3960); -#pragma pop - -/* 80C846AC-80C846B0 000008 0004+00 0/2 0/0 0/0 .rodata @3961 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3961 = -1.0f; -COMPILER_STRIP_GATE(0x80C846AC, &lit_3961); -#pragma pop - -/* 80C846B0-80C846B4 00000C 0004+00 0/1 0/0 0/0 .rodata @3962 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3962 = 10.0f; -COMPILER_STRIP_GATE(0x80C846B0, &lit_3962); -#pragma pop - -/* 80C846B4-80C846BC 000010 0008+00 0/2 0/0 0/0 .rodata @3964 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3964[8] = { - 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80C846B4, &lit_3964); -#pragma pop - /* 80C83E58-80C84238 000538 03E0+00 1/0 0/0 0/0 .text modeWait__16daObjLv6SwTurn_cFv */ void daObjLv6SwTurn_c::modeWait() { - // NONMATCHING + bool a = true; + int b = -1; + daPy_py_c* player = daPy_getPlayerActorClass(); + if (unk5AD) { + for (int i = 0; i < 2; i++) { + u32 timer; + if (cLib_checkBit(unk5C4, cBgW::PPLABEL_4)) { +#if DEBUG + timer = l_HIO.mWaitTime; +#else + timer = 0x2f; +#endif + } else { +#if DEBUG + timer = l_HIO.mChargeTime; +#else + timer = 0x23; +#endif + } + if (unk5AE[i] == (u8)timer) { + unk5B8 = i; + } + if (unk5AE[i] != 0) { + b = i; + } + } + if ((unk5B8 == 0 && unk5BC == 1) || (unk5B8 == 1 && unk5BC == -1)) { + unk5B8 = -1; + } else { + a = 0; + } + bool c = false; + if ((unk5BC == 0 && b != -1) || (unk5BC == 1 && b == 1) || (unk5BC == -1 && b == 0)) { + c = true; + } + if (c) { + if (b == 0) { + cLib_addCalcAngleS2(&unk5B4, 500 + KREG_S(1), 60, 5); + } else { + cLib_addCalcAngleS2(&unk5B4, -500 - KREG_S(1), 60, 5); + } + if (unk5BD == 18) { + fopAcM_seStart(this, Z2SE_OBJ_L6_RL_SW_ON, 0); + OS_REPORT("Lv6回転スイッチ:Z2SE_OBJ_L6_RL_SW_ON\n"); + } + unk5BD++; + unk5B2 = unk5B4 * std::fabs(cM_ssin((KREG_S(0) + 992) * unk5BD)) + 10.0f; + if (unk5B2 == unk5C8) { + unk5B2++; + } + } + if (unk5B8 != -1 && unk5CA == current.angle.y) { + ((daPy_py_c*)dComIfGp_getPlayer(0))->onPushPullKeep(); + init_modeRotate(); + } + } else { + unk5B4 = 0; + unk5BD = 0; + cLib_addCalcAngleS(&unk5B2, 0, 4, 50, 5); + } + shape_angle.y = current.angle.y + (unk5BC * 0x4000) + unk5B2; + if (a) { + for (int i = 0; i < 2; i++) { + unk5AE[i] = 0; + } + unk5B8 = -1; + } + if (daPy_py_c::checkNowWolf()) { + cXyz c = player->current.pos - current.pos; + mDoMtx_stack_c::YrotS(-shape_angle.y); + mDoMtx_stack_c::multVec(&c, &c); + if (c.z > 0.0f) { + if (unk5BC == -1) { + mpBgW->OffPushPullOk(); + } else { + mpBgW->OnPushPullOk(); + } + } else { + if (unk5BC == 1) { + mpBgW->OffPushPullOk(); + } else { + mpBgW->OnPushPullOk(); + } + } + } else { + mpBgW->OnPushPullOk(); + } + unk5C8 = unk5B2; + unk5CA = current.angle.y; } /* 80C84238-80C8425C 000918 0024+00 1/1 0/0 0/0 .text init_modeRotate__16daObjLv6SwTurn_cFv */ void daObjLv6SwTurn_c::init_modeRotate() { - // NONMATCHING + unk5B4 = 0; + unk5BD = 0; + unk5B0 = 0; + unk5B6 = shape_angle.y; + mMode = DAOBJLV6SWTURN_C_MODE_ROTATE; } -/* ############################################################################################## */ -/* 80C846BC-80C846C0 000018 0004+00 0/1 0/0 0/0 .rodata @4069 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4069 = 16384.0f; -COMPILER_STRIP_GATE(0x80C846BC, &lit_4069); -#pragma pop - -/* 80C846C0-80C846C4 00001C 0004+00 0/1 0/0 0/0 .rodata @4070 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4070 = 90.0f; -COMPILER_STRIP_GATE(0x80C846C0, &lit_4070); -#pragma pop - /* 80C8425C-80C844F8 00093C 029C+00 1/0 0/0 0/0 .text modeRotate__16daObjLv6SwTurn_cFv */ void daObjLv6SwTurn_c::modeRotate() { - // NONMATCHING + unk5B0++; +#if DEBUG + unk5B2 = (f32)unk5B0 / (f32)l_HIO.mRotationTime * (f32)0x4000; +#else + unk5B2 = (f32)unk5B0 / (f32)0x5a * (f32)0x4000; +#endif + if (unk5B8 == 1) { + unk5B2 = -unk5B2; + } + + shape_angle.y = unk5B6 + unk5B2; + + fopAcM_seStartLevel(this, Z2SE_OBJ_L6_RL_SW_MV, 0); +#if DEBUG + if (unk5B0 == l_HIO.mRotationTime) +#else + if (unk5B0 == 0x5a) +#endif + { + if (unk5B8 == 0) { + unk5BC++; + } else { + unk5BC--; + } + + if (unk5BC == 1) { + fopAcM_onSwitch(this, getSwbit()); + fopAcM_offSwitch(this, getSwbit2()); + } else if (unk5BC == 0) { + fopAcM_offSwitch(this, getSwbit()); + fopAcM_offSwitch(this, getSwbit2()); + } else if (unk5BC == -1) { + fopAcM_offSwitch(this, getSwbit()); + fopAcM_onSwitch(this, getSwbit2()); + } + ((daPy_py_c*)dComIfGp_getPlayer(0))->offPushPullKeep(); + fopAcM_seStart(this, Z2SE_OBJ_L6_RL_SW_OFF, 0); + + dComIfGp_getVibration().StartShock(8, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); + init_modeWait(); + } } /* 80C844F8-80C8459C 000BD8 00A4+00 1/0 0/0 0/0 .text Draw__16daObjLv6SwTurn_cFv */ -void daObjLv6SwTurn_c::Draw() { - // NONMATCHING +int daObjLv6SwTurn_c::Draw() { + g_env_light.settingTevStruct(0x10, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType_MAJI(unk5A8, &tevStr); + dComIfGd_setListBG(); + mDoExt_modelUpdateDL(unk5A8); + dComIfGd_setList(); +#if DEBUG + if (l_HIO.mDrawFlag) { + mpBgW->GetAttackThrough(0); + } +#endif + return TRUE; } /* 80C8459C-80C845D0 000C7C 0034+00 1/0 0/0 0/0 .text Delete__16daObjLv6SwTurn_cFv */ -void daObjLv6SwTurn_c::Delete() { - // NONMATCHING +int daObjLv6SwTurn_c::Delete() { + dComIfG_resDelete(&unk5A0, l_arcName); +#if DEBUG + l_HIO.removeHIO(); +#endif + return TRUE; +} + +/* 80C845D0-80C84630 000CB0 0060+00 1/0 0/0 0/0 .text + * daObjLv6SwTurn_create1st__FP16daObjLv6SwTurn_c */ +static int daObjLv6SwTurn_create1st(daObjLv6SwTurn_c* i_this) { + fopAcM_SetupActor(i_this, daObjLv6SwTurn_c); + return i_this->create1st(); +} + +/* 80C84630-80C84650 000D10 0020+00 1/0 0/0 0/0 .text + * daObjLv6SwTurn_MoveBGDelete__FP16daObjLv6SwTurn_c */ +static int daObjLv6SwTurn_MoveBGDelete(daObjLv6SwTurn_c* i_this) { + return i_this->MoveBGDelete(); +} + +/* 80C84650-80C84670 000D30 0020+00 1/0 0/0 0/0 .text + * daObjLv6SwTurn_MoveBGExecute__FP16daObjLv6SwTurn_c */ +static int daObjLv6SwTurn_MoveBGExecute(daObjLv6SwTurn_c* i_this) { + return i_this->MoveBGExecute(); +} + +/* 80C84670-80C8469C 000D50 002C+00 1/0 0/0 0/0 .text + * daObjLv6SwTurn_MoveBGDraw__FP16daObjLv6SwTurn_c */ +static int daObjLv6SwTurn_MoveBGDraw(daObjLv6SwTurn_c* i_this) { + return i_this->MoveBGDraw(); } /* ############################################################################################## */ /* 80C84724-80C84744 -00001 0020+00 1/0 0/0 0/0 .data daObjLv6SwTurn_METHODS */ static actor_method_class daObjLv6SwTurn_METHODS = { - (process_method_func)daObjLv6SwTurn_create1st__FP16daObjLv6SwTurn_c, - (process_method_func)daObjLv6SwTurn_MoveBGDelete__FP16daObjLv6SwTurn_c, - (process_method_func)daObjLv6SwTurn_MoveBGExecute__FP16daObjLv6SwTurn_c, - 0, - (process_method_func)daObjLv6SwTurn_MoveBGDraw__FP16daObjLv6SwTurn_c, + (process_method_func)daObjLv6SwTurn_create1st, + (process_method_func)daObjLv6SwTurn_MoveBGDelete, + (process_method_func)daObjLv6SwTurn_MoveBGExecute, + NULL, + (process_method_func)daObjLv6SwTurn_MoveBGDraw, }; /* 80C84744-80C84774 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Lv6SwTurn */ extern actor_process_profile_definition g_profile_Obj_Lv6SwTurn = { - fpcLy_CURRENT_e, // mLayerID - 3, // mListID - fpcPi_CURRENT_e, // mListPrio - PROC_Obj_Lv6SwTurn, // mProcName - &g_fpcLf_Method.base, // sub_method - sizeof(daObjLv6SwTurn_c), // mSize - 0, // mSizeOther - 0, // mParameters - &g_fopAc_Method.base, // sub_method - 15, // mPriority - &daObjLv6SwTurn_METHODS, // sub_method - 0x00040100, // mStatus - fopAc_ACTOR_e, // mActorType - fopAc_CULLBOX_CUSTOM_e, // cullType + fpcLy_CURRENT_e, // mLayerID + 3, // mListID + fpcPi_CURRENT_e, // mListPrio + PROC_Obj_Lv6SwTurn, // mProcName + &g_fpcLf_Method.base, // sub_method + sizeof(daObjLv6SwTurn_c), // mSize + 0, // mSizeOther + 0, // mParameters + &g_fopAc_Method.base, // sub_method + 15, // mPriority + &daObjLv6SwTurn_METHODS, // sub_method + 0x00040100, // mStatus + fopAc_ACTOR_e, // mActorType + fopAc_CULLBOX_CUSTOM_e, // cullType }; -/* 80C84774-80C8479C 0000A4 0028+00 1/1 0/0 0/0 .data __vt__16daObjLv6SwTurn_c */ -SECTION_DATA extern void* __vt__16daObjLv6SwTurn_c[10] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)CreateHeap__16daObjLv6SwTurn_cFv, - (void*)Create__16daObjLv6SwTurn_cFv, - (void*)Execute__16daObjLv6SwTurn_cFPPA3_A4_f, - (void*)Draw__16daObjLv6SwTurn_cFv, - (void*)Delete__16daObjLv6SwTurn_cFv, - (void*)IsDelete__16dBgS_MoveBgActorFv, - (void*)ToFore__16dBgS_MoveBgActorFv, - (void*)ToBack__16dBgS_MoveBgActorFv, -}; - -/* 80C845D0-80C84630 000CB0 0060+00 1/0 0/0 0/0 .text - * daObjLv6SwTurn_create1st__FP16daObjLv6SwTurn_c */ -static void daObjLv6SwTurn_create1st(daObjLv6SwTurn_c* param_0) { - // NONMATCHING -} - -/* 80C84630-80C84650 000D10 0020+00 1/0 0/0 0/0 .text - * daObjLv6SwTurn_MoveBGDelete__FP16daObjLv6SwTurn_c */ -static void daObjLv6SwTurn_MoveBGDelete(daObjLv6SwTurn_c* param_0) { - // NONMATCHING -} - -/* 80C84650-80C84670 000D30 0020+00 1/0 0/0 0/0 .text - * daObjLv6SwTurn_MoveBGExecute__FP16daObjLv6SwTurn_c */ -static void daObjLv6SwTurn_MoveBGExecute(daObjLv6SwTurn_c* param_0) { - // NONMATCHING -} - -/* 80C84670-80C8469C 000D50 002C+00 1/0 0/0 0/0 .text - * daObjLv6SwTurn_MoveBGDraw__FP16daObjLv6SwTurn_c */ -static void daObjLv6SwTurn_MoveBGDraw(daObjLv6SwTurn_c* param_0) { - // NONMATCHING -} - /* 80C846C4-80C846C4 000020 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */