From 7137f49bfc9535d95f980fb92552adf7b7c3c3ce Mon Sep 17 00:00:00 2001 From: YunataSavior <58997725+YunataSavior@users.noreply.github.com> Date: Sun, 19 Jan 2025 03:45:55 -0800 Subject: [PATCH] d_a_obj_octhashi equivalent except for weak func ordering of cCcD_GStts dtor (#2287) * Initial d_a_obj_octhashi work * More d_a_obj_octhashi work * d_a_obj_octhashi has 100% completion, but rodata doesn't match * d_a_obj_octhashi equivalent. Would fully match except for cCcD_GStts dtor * d_a_obj_octhashi update after feedback from Taka and hatal --- .../GZ2E01/rels/d_a_obj_octhashi/splits.txt | 4 +- .../GZ2E01/rels/d_a_obj_octhashi/symbols.txt | 18 +- configure.py | 2 +- include/SSystem/SComponent/c_cc_d.h | 7 +- include/d/actor/d_a_obj_octhashi.h | 46 +- src/d/actor/d_a_obj_octhashi.cpp | 824 ++++++------------ 6 files changed, 343 insertions(+), 558 deletions(-) diff --git a/config/GZ2E01/rels/d_a_obj_octhashi/splits.txt b/config/GZ2E01/rels/d_a_obj_octhashi/splits.txt index 203ce86ad39..ffb3b14487e 100644 --- a/config/GZ2E01/rels/d_a_obj_octhashi/splits.txt +++ b/config/GZ2E01/rels/d_a_obj_octhashi/splits.txt @@ -11,6 +11,6 @@ REL/executor.c: d/actor/d_a_obj_octhashi.cpp: .text start:0x00000078 end:0x00001938 - .rodata start:0x00000000 end:0x00000104 + .rodata start:0x00000000 end:0x00000103 .data start:0x00000000 end:0x000000FC - .bss start:0x00000000 end:0x00000004 + .bss start:0x00000000 end:0x00000001 diff --git a/config/GZ2E01/rels/d_a_obj_octhashi/symbols.txt b/config/GZ2E01/rels/d_a_obj_octhashi/symbols.txt index ea8d85eb72c..43bb2a29c2a 100644 --- a/config/GZ2E01/rels/d_a_obj_octhashi/symbols.txt +++ b/config/GZ2E01/rels/d_a_obj_octhashi/symbols.txt @@ -2,8 +2,8 @@ _prolog = .text:0x00000000; // type:function size:0x2C scope:global _epilog = .text:0x0000002C; // type:function size:0x2C scope:global _unresolved = .text:0x00000058; // type:function size:0x20 scope:global initCcCylinder__15daObjOCTHASHI_cFv = .text:0x00000078; // type:function size:0x1E0 scope:global -daObjOCTHASHI_Create__FP10fopAc_ac_c = .text:0x00000258; // type:function size:0x20 scope:global -daObjOCTHASHI_Delete__FP15daObjOCTHASHI_c = .text:0x00000278; // type:function size:0x44 scope:global +daObjOCTHASHI_Create__FP10fopAc_ac_c = .text:0x00000258; // type:function size:0x20 scope:local +daObjOCTHASHI_Delete__FP15daObjOCTHASHI_c = .text:0x00000278; // type:function size:0x44 scope:local SetCoSph__15daObjOCTHASHI_cFv = .text:0x000002BC; // type:function size:0xA8 scope:global SetCoCyl__15daObjOCTHASHI_cFv = .text:0x00000364; // type:function size:0x80 scope:global HakaiSet2__15daObjOCTHASHI_cFi = .text:0x000003E4; // type:function size:0x3CC scope:global @@ -15,9 +15,9 @@ SphAction__15daObjOCTHASHI_cFv = .text:0x00000A84; // type:function size:0x280 s SphAction2__15daObjOCTHASHI_cFv = .text:0x00000D04; // type:function size:0xB0 scope:global Action__15daObjOCTHASHI_cFv = .text:0x00000DB4; // type:function size:0xC8 scope:global setBaseMtx__15daObjOCTHASHI_cFv = .text:0x00000E7C; // type:function size:0xCC scope:global -rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c = .text:0x00000F48; // type:function size:0xC scope:global -daObjOCTHASHI_Draw__FP15daObjOCTHASHI_c = .text:0x00000F54; // type:function size:0x2C scope:global -daObjOCTHASHI_Execute__FP15daObjOCTHASHI_c = .text:0x00000F80; // type:function size:0x20 scope:global +rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c = .text:0x00000F48; // type:function size:0xC scope:local +daObjOCTHASHI_Draw__FP15daObjOCTHASHI_c = .text:0x00000F54; // type:function size:0x2C scope:local +daObjOCTHASHI_Execute__FP15daObjOCTHASHI_c = .text:0x00000F80; // type:function size:0x20 scope:local CreateHeap__15daObjOCTHASHI_cFv = .text:0x00000FA0; // type:function size:0xB8 scope:global create__15daObjOCTHASHI_cFv = .text:0x00001058; // type:function size:0x34C scope:global __dt__8cM3dGCylFv = .text:0x000013A4; // type:function size:0x48 scope:global @@ -30,7 +30,7 @@ __ct__9dCcD_SttsFv = .text:0x0000165C; // type:function size:0x54 scope:global __dt__10dCcD_GSttsFv = .text:0x000016B0; // type:function size:0x5C scope:global __ct__5csXyzFv = .text:0x0000170C; // type:function size:0x4 scope:global __ct__4cXyzFv = .text:0x00001710; // type:function size:0x4 scope:global -daObjOCTHASHI_IsDelete__FP15daObjOCTHASHI_c = .text:0x00001714; // type:function size:0x8 scope:global +daObjOCTHASHI_IsDelete__FP15daObjOCTHASHI_c = .text:0x00001714; // type:function size:0x8 scope:local __dt__10cCcD_GSttsFv = .text:0x0000171C; // type:function size:0x48 scope:global Create__15daObjOCTHASHI_cFv = .text:0x00001764; // type:function size:0x54 scope:global Execute__15daObjOCTHASHI_cFPPA3_A4_f = .text:0x000017B8; // type:function size:0x74 scope:global @@ -72,9 +72,9 @@ ccSphSrc$3655 = .rodata:0x00000000; // type:object size:0x40 scope:local @4166 = .rodata:0x000000C8; // type:object size:0x4 scope:local @4167 = .rodata:0x000000CC; // type:object size:0x4 scope:local @stringBase0 = .rodata:0x000000D0; // type:object size:0x33 scope:local data:string_table -l_arcName = .data:0x00000000; // type:object size:0x4 scope:global +l_arcName = .data:0x00000000; // type:object size:0x4 scope:local ccCylSrc$3656 = .data:0x00000004; // type:object size:0x44 scope:local data:float -l_daObjOCTHASHI_Method = .data:0x00000048; // type:object size:0x20 scope:global +l_daObjOCTHASHI_Method = .data:0x00000048; // type:object size:0x20 scope:local g_profile_OCTHASHI = .data:0x00000068; // type:object size:0x30 scope:global __vt__10cCcD_GStts = .data:0x00000098; // type:object size:0xC scope:global __vt__10dCcD_GStts = .data:0x000000A4; // type:object size:0xC scope:global @@ -82,4 +82,4 @@ __vt__8cM3dGSph = .data:0x000000B0; // type:object size:0xC scope:global __vt__8cM3dGCyl = .data:0x000000BC; // type:object size:0xC scope:global __vt__8cM3dGAab = .data:0x000000C8; // type:object size:0xC scope:global __vt__15daObjOCTHASHI_c = .data:0x000000D4; // type:object size:0x28 scope:global -lbl_584_bss_0 = .bss:0x00000000; // type:object size:0x1 data:byte +lbl_584_bss_0 = .bss:0x00000000; // type:object size:0x1 scope:local data:byte diff --git a/configure.py b/configure.py index 72d38e0d714..50c0d9eb12d 100644 --- a/configure.py +++ b/configure.py @@ -1968,7 +1968,7 @@ config.libs = [ ActorRel(NonMatching, "d_a_obj_nan"), ActorRel(NonMatching, "d_a_obj_ndoor"), ActorRel(NonMatching, "d_a_obj_nougu"), - ActorRel(NonMatching, "d_a_obj_octhashi"), + ActorRel(Equivalent, "d_a_obj_octhashi"), ActorRel(MatchingFor("GZ2E01"), "d_a_obj_oiltubo"), ActorRel(MatchingFor("GZ2E01"), "d_a_obj_onsen"), ActorRel(MatchingFor("GZ2E01"), "d_a_obj_onsenFire"), diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index 16690f6e2d0..19f49d769cc 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -453,6 +453,9 @@ public: u32 ChkNoCrr() const { return MskSPrm(0x100); } void OnNoCrrBit() { OnSPrmBit(0x100); } u32 ChkSph3DCrr() const { return MskSPrm(0x80); } + u32 ChkCoSameActorHit() const { return MskSPrm(cCcD_ObjCommonBase::CO_SPRM_SAME_ACTOR_HIT); } + void OnCoSameActorHit() { OnSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SAME_ACTOR_HIT); } + void OffCoSameActorHit() { OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SAME_ACTOR_HIT); } void ClrSet() { OffSPrmBit(1); } u32 ChkHit() { return MskRPrm(1); } @@ -481,7 +484,9 @@ public: bool ChkTgSet() const { return mObjTg.ChkSet(); } bool ChkAtSet() const { return mObjAt.ChkSet(); } bool ChkCoSet() const { return mObjCo.ChkSet(); } - u32 ChkCoSameActorHit() const { return mObjCo.MskSPrm(0x400); } + u32 ChkCoSameActorHit() const { return mObjCo.ChkCoSameActorHit(); } + void OnCoSameActorHit() { mObjCo.OnCoSameActorHit(); } + void OffCoSameActorHit() { mObjCo.OffCoSameActorHit(); } u32 GetCoVsGrp() const { return mObjCo.GetVsGrp(); } u32 GetCoIGrp() const { return mObjCo.GetIGrp(); } u8 GetAtAtp() const { return mObjAt.GetAtp(); } diff --git a/include/d/actor/d_a_obj_octhashi.h b/include/d/actor/d_a_obj_octhashi.h index cb7e5ade3b2..3be94388cd1 100644 --- a/include/d/actor/d_a_obj_octhashi.h +++ b/include/d/actor/d_a_obj_octhashi.h @@ -1,7 +1,8 @@ #ifndef D_A_OBJ_OCTHASHI_H #define D_A_OBJ_OCTHASHI_H -#include "f_op/f_op_actor_mng.h" +#include "d/d_bg_s_movebg_actor.h" +#include "d/d_com_inf_game.h" /** * @ingroup actors-objects @@ -11,7 +12,7 @@ * @details * */ -class daObjOCTHASHI_c : public fopAc_ac_c { +class daObjOCTHASHI_c : public dBgS_MoveBgActor { public: /* 80CA4BB8 */ void initCcCylinder(); /* 80CA4DFC */ void SetCoSph(); @@ -23,15 +24,42 @@ public: /* 80CA5844 */ void SphAction2(); /* 80CA58F4 */ void Action(); /* 80CA59BC */ void setBaseMtx(); - /* 80CA5AE0 */ void CreateHeap(); - /* 80CA5B98 */ void create(); - /* 80CA62A4 */ void Create(); - /* 80CA62F8 */ void Execute(f32 (**)[3][4]); - /* 80CA636C */ void Draw(); - /* 80CA6444 */ void Delete(); + /* 80CA5AE0 */ int CreateHeap(); + /* 80CA5B98 */ int create(); + /* 80CA62A4 */ int Create(); + /* 80CA62F8 */ int Execute(Mtx**); + /* 80CA636C */ int Draw(); + /* 80CA6444 */ int Delete(); private: - /* 0x568 */ u8 field_0x568[0x14b0 - 0x568]; + /* 0x5a0 */ cXyz field_0x5a0[8]; + /* 0x600 */ cXyz field_0x600[8]; + /* 0x660 */ csXyz field_0x660[8]; + /* 0x690 */ csXyz field_0x690[8]; + /* 0x6c0 */ u8 field_0x6c0[8]; + /* 0x6c8 */ u8 field_0x6c8; + /* 0x6c9 */ u8 field_0x6c9[0x6cb - 0x6c9]; + /* 0x6cb */ u8 field_0x6cb; + /* 0x6cc */ s16 field_0x6cc; + /* 0x6d0 */ f32 field_0x6d0; + /* 0x6d4 */ f32 field_0x6d4; + /* 0x6d8 */ f32 field_0x6d8; + /* 0x6dc */ s16 field_0x6dc; + /* 0x6de */ s16 field_0x6de; + /* 0x6e0 */ int mPieceNum; + /* 0x6e4 */ u32 field_0x6e4; +public: + /* 0x6e8 */ s16 field_0x6e8; + /* 0x6ec */ Z2Creature mSound; +private: + /* 0x77c */ u8 field_0x77c[4]; + /* 0x780 */ J3DModel* mpModel[8]; + /* 0x7a0 */ u8 field_0x7a0[0x7a4 - 0x7a0]; + /* 0x7a4 */ request_of_phase_process_class mPhaseReq; + /* 0x7ac */ dCcD_Stts field_0x7ac[8]; + /* 0x98c */ dCcD_Sph mColliders[8]; + /* 0x134c */ dCcD_Cyl mCyl; + /* 0x1488 */ u8 field_0x1488[0x14b0 - 0x1488]; }; STATIC_ASSERT(sizeof(daObjOCTHASHI_c) == 0x14b0); diff --git a/src/d/actor/d_a_obj_octhashi.cpp b/src/d/actor/d_a_obj_octhashi.cpp index 32b0011f5da..4014ce1444e 100644 --- a/src/d/actor/d_a_obj_octhashi.cpp +++ b/src/d/actor/d_a_obj_octhashi.cpp @@ -6,133 +6,11 @@ #include "d/actor/d_a_obj_octhashi.h" #include "d/d_cc_d.h" #include "dol2asm.h" - - -// -// Forward References: -// - -extern "C" void initCcCylinder__15daObjOCTHASHI_cFv(); -extern "C" static void daObjOCTHASHI_Create__FP10fopAc_ac_c(); -extern "C" static void daObjOCTHASHI_Delete__FP15daObjOCTHASHI_c(); -extern "C" void SetCoSph__15daObjOCTHASHI_cFv(); -extern "C" void SetCoCyl__15daObjOCTHASHI_cFv(); -extern "C" void HakaiSet2__15daObjOCTHASHI_cFi(); -extern "C" void HakaiMotion2__15daObjOCTHASHI_cFv(); -extern "C" void __dt__5csXyzFv(); -extern "C" void __dt__4cXyzFv(); -extern "C" void CylAction__15daObjOCTHASHI_cFv(); -extern "C" void SphAction__15daObjOCTHASHI_cFv(); -extern "C" void SphAction2__15daObjOCTHASHI_cFv(); -extern "C" void Action__15daObjOCTHASHI_cFv(); -extern "C" void setBaseMtx__15daObjOCTHASHI_cFv(); -extern "C" static void rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c(); -extern "C" static void daObjOCTHASHI_Draw__FP15daObjOCTHASHI_c(); -extern "C" static void daObjOCTHASHI_Execute__FP15daObjOCTHASHI_c(); -extern "C" void CreateHeap__15daObjOCTHASHI_cFv(); -extern "C" void create__15daObjOCTHASHI_cFv(); -extern "C" void __dt__8cM3dGCylFv(); -extern "C" void __dt__8cM3dGAabFv(); -extern "C" void __dt__8dCcD_SphFv(); -extern "C" void __ct__8dCcD_SphFv(); -extern "C" void __dt__8cM3dGSphFv(); -extern "C" void __dt__9dCcD_SttsFv(); -extern "C" void __ct__9dCcD_SttsFv(); -extern "C" void __dt__10dCcD_GSttsFv(); -extern "C" void __ct__5csXyzFv(); -extern "C" void __ct__4cXyzFv(); -extern "C" static bool daObjOCTHASHI_IsDelete__FP15daObjOCTHASHI_c(); -extern "C" void __dt__10cCcD_GSttsFv(); -extern "C" void Create__15daObjOCTHASHI_cFv(); -extern "C" void Execute__15daObjOCTHASHI_cFPPA3_A4_f(); -extern "C" void Draw__15daObjOCTHASHI_cFv(); -extern "C" void Delete__15daObjOCTHASHI_cFv(); -extern "C" extern char const* const d_a_obj_octhashi__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 transM__14mDoMtx_stack_cFfff(); -extern "C" void ZXYrotM__14mDoMtx_stack_cFRC5csXyz(); -extern "C" void mDoExt_modelUpdateDL__FP8J3DModel(); -extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); -extern "C" void fopAcM_setCullSizeBox__FP10fopAc_ac_cffffff(); -extern "C" void gndCheck__11fopAcM_gc_cFPC4cXyz(); -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 isDungeonItem__12dSv_memBit_cCFi(); -extern "C" void getRes__14dRes_control_cFPCcPCcP11dRes_info_ci(); -extern "C" void getObjectResName2Index__14dRes_control_cFPCcPCc(); -extern "C" void -set__13dPa_control_cFUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); -extern "C" void Release__4cBgSFP9dBgW_Base(); -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 __ct__10dCcD_GSttsFv(); -extern "C" void Init__9dCcD_SttsFiiP10fopAc_ac_c(); -extern "C" void __ct__12dCcD_GObjInfFv(); -extern "C" void __dt__12dCcD_GObjInfFv(); -extern "C" void ChkTgHit__12dCcD_GObjInfFv(); -extern "C" void GetTgHitObj__12dCcD_GObjInfFv(); -extern "C" void ChkCoHit__12dCcD_GObjInfFv(); -extern "C" void GetCoHitObj__12dCcD_GObjInfFv(); -extern "C" void Set__8dCcD_CylFRC11dCcD_SrcCyl(); -extern "C" void Set__8dCcD_SphFRC11dCcD_SrcSph(); -extern "C" void def_se_set__FP10Z2CreatureP8cCcD_ObjUlP10fopAc_ac_c(); -extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); -extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); -extern "C" void GetAc__8cCcD_ObjFv(); -extern "C" void Set__4cCcSFP8cCcD_Obj(); -extern "C" void __ct__5csXyzFsss(); -extern "C" void __apl__5csXyzFR5csXyz(); -extern "C" void cM_rndFX__Ff(); -extern "C" void ChkUsed__9cBgW_BgIdCFv(); -extern "C" void SetC__8cM3dGCylFRC4cXyz(); -extern "C" void SetH__8cM3dGCylFf(); -extern "C" void SetC__8cM3dGSphFRC4cXyz(); -extern "C" void SetR__8cM3dGSphFf(); -extern "C" void cLib_targetAngleY__FPC3VecPC3Vec(); -extern "C" void seStart__7Z2SeMgrF10JAISoundIDPC3VecUlScffffUc(); -extern "C" void __ct__10Z2CreatureFv(); -extern "C" void init__10Z2CreatureFP3VecP3VecUcUc(); -extern "C" void __dl__FPv(); -extern "C" void __construct_array(); -extern "C" void _savegpr_20(); -extern "C" void _savegpr_21(); -extern "C" void _savegpr_24(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_27(); -extern "C" void _savegpr_28(); -extern "C" void _restgpr_20(); -extern "C" void _restgpr_21(); -extern "C" void _restgpr_24(); -extern "C" void _restgpr_25(); -extern "C" void _restgpr_27(); -extern "C" void _restgpr_28(); -extern "C" extern void* __vt__8dCcD_Sph[36]; -extern "C" extern void* __vt__8dCcD_Cyl[36]; -extern "C" extern void* __vt__9dCcD_Stts[11]; -extern "C" extern void* __vt__12cCcD_SphAttr[25]; -extern "C" extern void* __vt__12cCcD_CylAttr[25]; -extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; -extern "C" extern void* __vt__9cCcD_Stts[8]; -extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" extern u8 g_dComIfG_gameInfo[122384]; -extern "C" f32 mGroundY__11fopAcM_gc_c; -extern "C" u8 mAudioMgrPtr__10Z2AudioMgr[4 + 4 /* padding */]; -extern "C" extern u8 data_80CA6680[4]; +#include "d/d_resorce.h" +#include "SSystem/SComponent/c_math.h" +#include "d/d_bg_w.h" +#include "d/d_cc_uty.h" +#include "Z2AudioLib/Z2Instances.h" // // Declarations: @@ -152,50 +30,10 @@ const static dCcD_SrcSph ccSphSrc = { } // mSphAttr }; -/* 80CA64C0-80CA64C4 000040 0004+00 0/1 0/0 0/0 .rodata @3681 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3681 = 800.0f; -COMPILER_STRIP_GATE(0x80CA64C0, &lit_3681); -#pragma pop - -/* 80CA64C4-80CA64C8 000044 0004+00 0/2 0/0 0/0 .rodata @3682 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3682 = 100.0f; -COMPILER_STRIP_GATE(0x80CA64C4, &lit_3682); -#pragma pop - -/* 80CA64C8-80CA64CC 000048 0004+00 1/5 0/0 0/0 .rodata @3683 */ -SECTION_RODATA static u8 const lit_3683[4] = { - 0x00, - 0x00, - 0x00, - 0x00, -}; -COMPILER_STRIP_GATE(0x80CA64C8, &lit_3683); - -/* 80CA64CC-80CA64D0 00004C 0004+00 0/1 0/0 0/0 .rodata @3684 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3684 = 400.0f; -COMPILER_STRIP_GATE(0x80CA64CC, &lit_3684); -#pragma pop - -/* 80CA64D0-80CA64D8 000050 0008+00 1/3 0/0 0/0 .rodata @3686 */ -SECTION_RODATA static u8 const lit_3686[8] = { - 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80CA64D0, &lit_3686); - /* 80CA6550-80CA6550 0000D0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_80CA6550 = "Octhashi"; -#pragma pop - -/* 80CA6584-80CA6588 -00001 0004+00 3/3 0/0 0/0 .data l_arcName */ -SECTION_DATA static void* l_arcName = (void*)&d_a_obj_octhashi__stringBase0; +static char* l_arcName[1] = { + "Octhashi" +}; /* 80CA6588-80CA65CC 000004 0044+00 1/1 0/0 0/0 .data ccCylSrc$3656 */ static dCcD_SrcCyl ccCylSrc = { @@ -212,313 +50,292 @@ static dCcD_SrcCyl ccCylSrc = { } // mCyl }; +static s8 lbl_584_bss_0 = 0; + /* 80CA4BB8-80CA4D98 000078 01E0+00 1/1 0/0 0/0 .text initCcCylinder__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::initCcCylinder() { - // NONMATCHING + if (lbl_584_bss_0 == 0) { + ccCylSrc.mCyl.mHeight = (f32)(mPieceNum + 1) * 800.0f - 100.f; + lbl_584_bss_0 = 1; + } + for (int idx = 0; idx < mPieceNum; ++idx) { + field_0x7ac[idx].Init(200, 0xff, this); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::YrotM(shape_angle.y); + mDoMtx_stack_c::transM(0.0f, (f32)idx * 800.0f + 400.0f, 0.0f); + mDoMtx_stack_c::multVecZero(&field_0x5a0[idx]); + mColliders[idx].Set(ccSphSrc); + mColliders[idx].SetStts(&field_0x7ac[idx]); + mColliders[idx].SetC(field_0x5a0[idx]); // Correct? Incorrect? + mColliders[idx].OnCoSameActorHit(); + } + mCyl.Set(ccCylSrc); + mCyl.SetStts(&field_0x7ac[0]); + mCyl.SetC(current.pos); + mCyl.OnCoSameActorHit(); } /* 80CA4D98-80CA4DB8 000258 0020+00 1/0 0/0 0/0 .text daObjOCTHASHI_Create__FP10fopAc_ac_c */ -static void daObjOCTHASHI_Create(fopAc_ac_c* param_0) { - // NONMATCHING +static int daObjOCTHASHI_Create(fopAc_ac_c* i_this) { + return static_cast(i_this)->create(); } /* 80CA4DB8-80CA4DFC 000278 0044+00 1/0 0/0 0/0 .text daObjOCTHASHI_Delete__FP15daObjOCTHASHI_c */ -static void daObjOCTHASHI_Delete(daObjOCTHASHI_c* param_0) { - // NONMATCHING +static int daObjOCTHASHI_Delete(daObjOCTHASHI_c* i_this) { + fopAcM_GetID(i_this); + i_this->MoveBGDelete(); + i_this->mSound.deleteObject(); + return 1; } -/* ############################################################################################## */ -/* 80CA64D8-80CA64DC 000058 0004+00 1/1 0/0 0/0 .rodata @3713 */ -SECTION_RODATA static f32 const lit_3713 = 470.0f; -COMPILER_STRIP_GATE(0x80CA64D8, &lit_3713); - /* 80CA4DFC-80CA4EA4 0002BC 00A8+00 1/1 0/0 0/0 .text SetCoSph__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::SetCoSph() { - // NONMATCHING + for (int idx = 0; idx < mPieceNum; ++idx) { + mColliders[idx].OffCoSameActorHit(); + mColliders[idx].SetR(470.0f); + mColliders[idx].SetC(field_0x5a0[idx]); + dComIfG_Ccsp()->Set(&mColliders[idx]); + } } -/* ############################################################################################## */ -/* 80CA64DC-80CA64E0 00005C 0004+00 1/1 0/0 0/0 .rodata @3718 */ -SECTION_RODATA static f32 const lit_3718 = 790.0f; -COMPILER_STRIP_GATE(0x80CA64DC, &lit_3718); - /* 80CA4EA4-80CA4F24 000364 0080+00 1/1 0/0 0/0 .text SetCoCyl__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::SetCoCyl() { - // NONMATCHING + mCyl.SetC(current.pos); + mCyl.SetH(mPieceNum * 790.0f); + dComIfG_Ccsp()->Set(&mCyl); } -/* ############################################################################################## */ -/* 80CA64E0-80CA64E4 000060 0004+00 0/2 0/0 0/0 .rodata @3776 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3776 = 10.0f; -COMPILER_STRIP_GATE(0x80CA64E0, &lit_3776); -#pragma pop - -/* 80CA64E4-80CA64E8 000064 0004+00 0/1 0/0 0/0 .rodata @3777 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3777 = 4.0f / 5.0f; -COMPILER_STRIP_GATE(0x80CA64E4, &lit_3777); -#pragma pop - -/* 80CA64E8-80CA64EC 000068 0004+00 0/1 0/0 0/0 .rodata @3778 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3778 = 8000.0f; -COMPILER_STRIP_GATE(0x80CA64E8, &lit_3778); -#pragma pop - -/* 80CA64EC-80CA64F0 00006C 0004+00 0/1 0/0 0/0 .rodata @3779 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3779 = 3.0f / 5.0f; -COMPILER_STRIP_GATE(0x80CA64EC, &lit_3779); -#pragma pop - -/* 80CA64F0-80CA64F4 000070 0004+00 0/3 0/0 0/0 .rodata @3780 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3780 = 1.0f; -COMPILER_STRIP_GATE(0x80CA64F0, &lit_3780); -#pragma pop - -/* 80CA64F4-80CA64F8 000074 0004+00 0/1 0/0 0/0 .rodata @3781 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3781 = 7.0f / 10.0f; -COMPILER_STRIP_GATE(0x80CA64F4, &lit_3781); -#pragma pop - /* 80CA4F24-80CA52F0 0003E4 03CC+00 1/1 0/0 0/0 .text HakaiSet2__15daObjOCTHASHI_cFi */ void daObjOCTHASHI_c::HakaiSet2(int param_0) { - // NONMATCHING -} + for (int idx = param_0 - 1; idx >= 0; --idx) { + field_0x6d8 += 10.0f; + field_0x600[idx].set(0.0f, field_0x600[idx + 1].y * 0.8f, field_0x6d8); -/* ############################################################################################## */ -/* 80CA64F8-80CA6500 000078 0004+04 0/1 0/0 0/0 .rodata @3823 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3823[1 + 1 /* padding */] = { - 7.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x80CA64F8, &lit_3823); -#pragma pop + int spA = field_0x6cc + cM_rndFX(8000.0f); + mDoMtx_stack_c::YrotS(spA); + mDoMtx_stack_c::multVec(&field_0x600[idx], &field_0x600[idx]); + if (field_0x600[idx].y > 0.0f) { + field_0x600[idx].y = -field_0x600[idx].y; + } + field_0x6dc = field_0x6dc * 0.8f; + field_0x6de = field_0x6de * 0.8f; + field_0x690[idx].set(field_0x6dc, 0, field_0x690[idx + 1].z * 0.6f); + field_0x660[idx].y = spA - shape_angle.y; + dComIfGp_particle_set(0x87eb, &field_0x5a0[idx], NULL, &field_0x660[idx], NULL); + } + + for (int idx = param_0 + 1; idx < mPieceNum; ++idx) { + field_0x6d4 += 10.0f; + field_0x600[idx].set(0.0f, -field_0x600[idx-1].y * 0.8f, field_0x6d4); + + int sp8 = field_0x6cc + cM_rndFX(8000.0f); + mDoMtx_stack_c::multVec(&field_0x600[idx], &field_0x600[idx]); + if (field_0x600[idx].y < 0.0f) { + field_0x600[idx].y = -field_0x600[idx].y; + } + field_0x690[idx].set(field_0x690[idx - 1].x * 0.7f, 0, field_0x690[idx - 1].z * 0.7f); + field_0x660[idx].y = sp8 - shape_angle.y; + dComIfGp_particle_set(0x87eb, &field_0x5a0[idx], NULL, &field_0x660[idx], NULL); + } + + field_0x6c8 = 1; +} /* 80CA52F0-80CA546C 0007B0 017C+00 1/1 0/0 0/0 .text HakaiMotion2__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::HakaiMotion2() { - // NONMATCHING -} - -/* 80CA546C-80CA54A8 00092C 003C+00 1/1 0/0 0/0 .text __dt__5csXyzFv */ -// csXyz::~csXyz() { -extern "C" void __dt__5csXyzFv() { - // NONMATCHING -} - -/* 80CA54A8-80CA54E4 000968 003C+00 1/1 0/0 0/0 .text __dt__4cXyzFv */ -// cXyz::~cXyz() { -extern "C" void __dt__4cXyzFv() { - // NONMATCHING + int num_processed = 0; + cXyz cStack_20(7.0f, 7.0f, 7.0f); + csXyz cStack_28(0, 0, 0); + for (int idx = 0; idx < mPieceNum; ++idx) { + field_0x660[idx] += field_0x690[idx]; + field_0x600[idx].y += gravity; + field_0x5a0[idx] += field_0x600[idx]; + if (field_0x5a0[idx].y < field_0x6d0) { + if (field_0x6c0[idx] == 0) { + dComIfGp_particle_set(0x8c6e, &field_0x5a0[idx], &tevStr, &cStack_28, &cStack_20); + } + field_0x6c0[idx] = 1; + field_0x5a0[idx].y = field_0x6d0; + field_0x600[idx].set(0.0f, 0.0f, 0.0f); + field_0x690[idx].set(0, 0, 0); + ++num_processed; + if (num_processed == mPieceNum) { + ++field_0x6cb; + } + } + } } /* 80CA54E4-80CA55C4 0009A4 00E0+00 1/1 0/0 0/0 .text CylAction__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::CylAction() { - // NONMATCHING + if (mCyl.ChkTgHit()) { + eyePos = *mCyl.GetTgHitPosP(); + cCcD_Obj* my_obj = mCyl.GetTgHitObj(); + def_se_set(&mSound, my_obj, 0x2a, NULL); + mCyl.ClrTgHit(); + } + if (mCyl.ChkCoHit() && mCyl.GetCoHitObj()->GetStts()->GetWeightUc() == 0xff) { + field_0x6cb += 1; + if (mpBgW && mpBgW->ChkUsed()) { + dComIfG_Bgsp().Release(mpBgW); + } + } } -/* ############################################################################################## */ -/* 80CA6500-80CA6508 000080 0008+00 0/0 0/0 0/0 .rodata @3887 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3887[8] = { - 0x3F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80CA6500, &lit_3887); -#pragma pop - -/* 80CA6508-80CA6510 000088 0008+00 0/0 0/0 0/0 .rodata @3888 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3888[8] = { - 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80CA6508, &lit_3888); -#pragma pop - -/* 80CA6510-80CA6518 000090 0008+00 0/0 0/0 0/0 .rodata @3889 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_3889[8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80CA6510, &lit_3889); -#pragma pop - -/* 80CA6518-80CA651C 000098 0004+00 0/0 0/0 0/0 .rodata @3890 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3890 = 2000.0f; -COMPILER_STRIP_GATE(0x80CA6518, &lit_3890); -#pragma pop - -/* 80CA651C-80CA6520 00009C 0004+00 0/0 0/0 0/0 .rodata @3903 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3903 = 608.0f; -COMPILER_STRIP_GATE(0x80CA651C, &lit_3903); -#pragma pop - -/* 80CA6520-80CA6524 0000A0 0004+00 0/0 0/0 0/0 .rodata @3904 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3904 = 448.0f; -COMPILER_STRIP_GATE(0x80CA6520, &lit_3904); -#pragma pop - -/* 80CA6524-80CA6528 0000A4 0004+00 0/1 0/0 0/0 .rodata @3989 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3989 = -40.0f; -COMPILER_STRIP_GATE(0x80CA6524, &lit_3989); -#pragma pop - -/* 80CA6528-80CA652C 0000A8 0004+00 0/1 0/0 0/0 .rodata @3990 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3990 = 2.0f / 25.0f; -COMPILER_STRIP_GATE(0x80CA6528, &lit_3990); -#pragma pop - -/* 80CA652C-80CA6530 0000AC 0004+00 0/2 0/0 0/0 .rodata @3991 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3991 = -1.0f; -COMPILER_STRIP_GATE(0x80CA652C, &lit_3991); -#pragma pop - -/* 80CA6530-80CA6534 0000B0 0004+00 0/3 0/0 0/0 .rodata @3992 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3992 = 500.0f; -COMPILER_STRIP_GATE(0x80CA6530, &lit_3992); -#pragma pop - -/* 80CA6534-80CA6538 0000B4 0004+00 0/1 0/0 0/0 .rodata @3993 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3993 = 15.0f; -COMPILER_STRIP_GATE(0x80CA6534, &lit_3993); -#pragma pop - -/* 80CA6538-80CA653C 0000B8 0004+00 0/1 0/0 0/0 .rodata @3994 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3994 = -15.0f; -COMPILER_STRIP_GATE(0x80CA6538, &lit_3994); -#pragma pop - -/* 80CA653C-80CA6540 0000BC 0004+00 0/1 0/0 0/0 .rodata @3995 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3995 = 0.5f; -COMPILER_STRIP_GATE(0x80CA653C, &lit_3995); -#pragma pop - /* 80CA55C4-80CA5844 000A84 0280+00 1/1 0/0 0/0 .text SphAction__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::SphAction() { - // NONMATCHING + // The following replace the unused rodata lits: + f32 padding[1] = {0.0f}; + f32 fvals_3887[2] = {1.75f, 0.0f}; + f32 fvals_3888[2] = {2.125f, 0.0f}; + f32 fvals_3889[2] = {0.0f, 0.0f}; + f32 fval_3890[1] = {2000.0f}; + f32 fval_3903[1] = {608.0f}; + f32 fval_3904[1] = {448.0f}; + for (int idx = 0; idx < mPieceNum; ++idx) { + if (mColliders[idx].ChkCoHit()) { + fopAc_ac_c* hit_actor = dCc_GetAc(mColliders[idx].GetCoHitObj()->GetAc()); + if (mColliders[idx].GetCoHitObj()->GetStts()->GetWeightUc() == 0xff) { + cXyz& hit_actor_pos = fopAcM_GetPosition(hit_actor); + field_0x6cc = cLib_targetAngleY(&field_0x5a0[idx], &hit_actor_pos); + if (field_0x6c8 == 0) { + field_0x6d4 = -40.0f; + field_0x6d8 = -40.0f; + field_0x600[idx].set(0.0f, (field_0x5a0[idx].y - hit_actor_pos.y)*0.08f, field_0x6d4); + field_0x690[idx].x = 0x200; + field_0x6dc = -field_0x690[idx].x; + field_0x690[idx].y = 0; + field_0x6de = -field_0x690[idx].y; + field_0x660[idx].y = field_0x6cc - shape_angle.y; + Z2GetAudioMgr()->seStart(JAISoundID(0x70354), &field_0x5a0[idx], + 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); + HakaiSet2(idx); + field_0x6e4 = idx; + } else { + field_0x6e4 = 7; + field_0x690[idx].x = cM_rndFX(500.0f); + field_0x690[idx].y = cM_rndFX(500.0f); + field_0x600[idx].set(cM_rndFX(10.0f), 15.0f, -15.0f); + } + mDoMtx_stack_c::YrotS(field_0x6cc); + mDoMtx_stack_c::multVec(&field_0x600[idx], &field_0x600[idx]); + break; + } + } + } + if (field_0x6c8 != 0) { + HakaiMotion2(); + for (int idx = 0; idx < mPieceNum; ++idx) { + cXyz* cc_move_p = field_0x7ac[idx].GetCCMoveP(); + if (cc_move_p != NULL) { + (*cc_move_p) *= 0.5f; + field_0x5a0[idx] += *cc_move_p; + } + } + } + return; } /* 80CA5844-80CA58F4 000D04 00B0+00 1/1 0/0 0/0 .text SphAction2__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::SphAction2() { - // NONMATCHING + for (int idx = 0; idx < mPieceNum; ++idx) { + if (mColliders[idx].ChkTgHit()) { + cCcD_Obj* my_obj = mColliders[idx].GetTgHitObj(); + eyePos = *mColliders[idx].GetTgHitPosP(); + def_se_set(&mSound, my_obj, 0x2a, NULL); + mColliders[idx].ClrTgHit(); + } + } } /* 80CA58F4-80CA59BC 000DB4 00C8+00 1/1 0/0 0/0 .text Action__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::Action() { - // NONMATCHING + switch (field_0x6cb) { + case 0: + field_0x6e8 -= 1; + if (field_0x6e8 <= 0) { + field_0x6e8 = 0; + } + if (field_0x6e8 == 0) { + mCyl.OnTgSetBit(); + } else { + mCyl.OffTgSetBit(); + } + CylAction(); + SetCoCyl(); + break; + case 1: + SphAction(); + SetCoSph(); + break; + case 2: + SphAction2(); + SetCoSph(); + break; + } } -/* ############################################################################################## */ -/* 80CA6540-80CA6544 0000C0 0004+00 1/1 0/0 0/0 .rodata @4057 */ -SECTION_RODATA static f32 const lit_4057 = -400.0f; -COMPILER_STRIP_GATE(0x80CA6540, &lit_4057); - /* 80CA59BC-80CA5A88 000E7C 00CC+00 1/1 0/0 0/0 .text setBaseMtx__15daObjOCTHASHI_cFv */ void daObjOCTHASHI_c::setBaseMtx() { - // NONMATCHING + for (int idx = 0; idx < mPieceNum; ++idx) { + mDoMtx_stack_c::transS(field_0x5a0[idx]); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_stack_c::ZXYrotM(field_0x660[idx]); + mDoMtx_stack_c::transM(0.0f, -400.0f, 0.0f); + mpModel[idx]->setBaseTRMtx(mDoMtx_stack_c::get()); + } + cMtx_copy(mDoMtx_stack_c::get(), mBgMtx); } /* 80CA5A88-80CA5A94 000F48 000C+00 1/1 0/0 0/0 .text * rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ static void rideCallBack(dBgW* param_0, fopAc_ac_c* param_1, fopAc_ac_c* param_2) { - // NONMATCHING + static_cast(param_1)->field_0x6e8 = 0x1e; } /* 80CA5A94-80CA5AC0 000F54 002C+00 1/0 0/0 0/0 .text daObjOCTHASHI_Draw__FP15daObjOCTHASHI_c */ -static void daObjOCTHASHI_Draw(daObjOCTHASHI_c* param_0) { - // NONMATCHING +static int daObjOCTHASHI_Draw(daObjOCTHASHI_c* i_this) { + return i_this->Draw(); } /* 80CA5AC0-80CA5AE0 000F80 0020+00 2/1 0/0 0/0 .text daObjOCTHASHI_Execute__FP15daObjOCTHASHI_c */ -static void daObjOCTHASHI_Execute(daObjOCTHASHI_c* param_0) { - // NONMATCHING +static int daObjOCTHASHI_Execute(daObjOCTHASHI_c* i_this) { + return i_this->MoveBGExecute(); } -/* ############################################################################################## */ -/* 80CA6550-80CA6550 0000D0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_80CA6559 = "S_octhashi00.bmd"; -#pragma pop +// FIXME: Does this go here? +static bool daObjOCTHASHI_IsDelete(daObjOCTHASHI_c* param_0); /* 80CA5AE0-80CA5B98 000FA0 00B8+00 1/0 0/0 0/0 .text CreateHeap__15daObjOCTHASHI_cFv */ -void daObjOCTHASHI_c::CreateHeap() { - // NONMATCHING +int daObjOCTHASHI_c::CreateHeap() { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName[0], "S_octhashi00.bmd"); + + if (modelData == NULL) { + // FIXME: For shield decomp matching, needs a JUT assert. + } + + int idx = 0; + while (idx < mPieceNum) { + mpModel[idx] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); + if (mpModel[idx] == NULL) { + return 0; + } + ++idx; + } + + return 1; } -/* ############################################################################################## */ -/* 80CA6544-80CA6548 0000C4 0004+00 0/2 0/0 0/0 .rodata @4165 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4165 = -1000.0f; -COMPILER_STRIP_GATE(0x80CA6544, &lit_4165); -#pragma pop - -/* 80CA6548-80CA654C 0000C8 0004+00 0/2 0/0 0/0 .rodata @4166 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4166 = -500.0f; -COMPILER_STRIP_GATE(0x80CA6548, &lit_4166); -#pragma pop - -/* 80CA654C-80CA6550 0000CC 0004+00 0/2 0/0 0/0 .rodata @4167 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4167 = 1000.0f; -COMPILER_STRIP_GATE(0x80CA654C, &lit_4167); -#pragma pop - -/* 80CA6550-80CA6550 0000D0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_80CA656A = "D_MN01A"; -SECTION_DEAD static char const* const stringBase_80CA6572 = "S_octhashi00.dzb"; -#pragma pop - /* 80CA65CC-80CA65EC -00001 0020+00 1/0 0/0 0/0 .data l_daObjOCTHASHI_Method */ static actor_method_class l_daObjOCTHASHI_Method = { - (process_method_func)daObjOCTHASHI_Create__FP10fopAc_ac_c, - (process_method_func)daObjOCTHASHI_Delete__FP15daObjOCTHASHI_c, - (process_method_func)daObjOCTHASHI_Execute__FP15daObjOCTHASHI_c, - (process_method_func)daObjOCTHASHI_IsDelete__FP15daObjOCTHASHI_c, - (process_method_func)daObjOCTHASHI_Draw__FP15daObjOCTHASHI_c, + (process_method_func)daObjOCTHASHI_Create, + (process_method_func)daObjOCTHASHI_Delete, + (process_method_func)daObjOCTHASHI_Execute, + (process_method_func)daObjOCTHASHI_IsDelete, + (process_method_func)daObjOCTHASHI_Draw, }; /* 80CA65EC-80CA661C -00001 0030+00 0/0 0/0 1/0 .data g_profile_OCTHASHI */ @@ -539,118 +356,43 @@ extern actor_process_profile_definition g_profile_OCTHASHI = { fopAc_CULLBOX_CUSTOM_e, // cullType }; -/* 80CA661C-80CA6628 000098 000C+00 3/3 0/0 0/0 .data __vt__10cCcD_GStts */ -SECTION_DATA extern void* __vt__10cCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10cCcD_GSttsFv, -}; - -/* 80CA6628-80CA6634 0000A4 000C+00 2/2 0/0 0/0 .data __vt__10dCcD_GStts */ -SECTION_DATA extern void* __vt__10dCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10dCcD_GSttsFv, -}; - -/* 80CA6634-80CA6640 0000B0 000C+00 3/3 0/0 0/0 .data __vt__8cM3dGSph */ -SECTION_DATA extern void* __vt__8cM3dGSph[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGSphFv, -}; - -/* 80CA6640-80CA664C 0000BC 000C+00 2/2 0/0 0/0 .data __vt__8cM3dGCyl */ -SECTION_DATA extern void* __vt__8cM3dGCyl[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGCylFv, -}; - -/* 80CA664C-80CA6658 0000C8 000C+00 4/4 0/0 0/0 .data __vt__8cM3dGAab */ -SECTION_DATA extern void* __vt__8cM3dGAab[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGAabFv, -}; - -/* 80CA6658-80CA6680 0000D4 0028+00 1/1 0/0 0/0 .data __vt__15daObjOCTHASHI_c */ -SECTION_DATA extern void* __vt__15daObjOCTHASHI_c[10] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)CreateHeap__15daObjOCTHASHI_cFv, - (void*)Create__15daObjOCTHASHI_cFv, - (void*)Execute__15daObjOCTHASHI_cFPPA3_A4_f, - (void*)Draw__15daObjOCTHASHI_cFv, - (void*)Delete__15daObjOCTHASHI_cFv, - (void*)IsDelete__16dBgS_MoveBgActorFv, - (void*)ToFore__16dBgS_MoveBgActorFv, - (void*)ToBack__16dBgS_MoveBgActorFv, -}; - /* 80CA5B98-80CA5EE4 001058 034C+00 1/1 0/0 0/0 .text create__15daObjOCTHASHI_cFv */ -void daObjOCTHASHI_c::create() { - // NONMATCHING -} - -/* 80CA5EE4-80CA5F2C 0013A4 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGCylFv */ -// cM3dGCyl::~cM3dGCyl() { -extern "C" void __dt__8cM3dGCylFv() { - // NONMATCHING -} - -/* 80CA5F2C-80CA5F74 0013EC 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGAabFv */ -// cM3dGAab::~cM3dGAab() { -extern "C" void __dt__8cM3dGAabFv() { - // NONMATCHING -} - -/* 80CA5F74-80CA6040 001434 00CC+00 1/1 0/0 0/0 .text __dt__8dCcD_SphFv */ -// dCcD_Sph::~dCcD_Sph() { -extern "C" void __dt__8dCcD_SphFv() { - // NONMATCHING -} - -/* 80CA6040-80CA60C4 001500 0084+00 1/1 0/0 0/0 .text __ct__8dCcD_SphFv */ -// dCcD_Sph::dCcD_Sph() { -extern "C" void __ct__8dCcD_SphFv() { - // NONMATCHING -} - -/* 80CA60C4-80CA610C 001584 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGSphFv */ -// cM3dGSph::~cM3dGSph() { -extern "C" void __dt__8cM3dGSphFv() { - // NONMATCHING -} - -/* 80CA610C-80CA619C 0015CC 0090+00 1/1 0/0 0/0 .text __dt__9dCcD_SttsFv */ -// dCcD_Stts::~dCcD_Stts() { -extern "C" void __dt__9dCcD_SttsFv() { - // NONMATCHING -} - -/* 80CA619C-80CA61F0 00165C 0054+00 1/1 0/0 0/0 .text __ct__9dCcD_SttsFv */ -// dCcD_Stts::dCcD_Stts() { -extern "C" void __ct__9dCcD_SttsFv() { - // NONMATCHING -} - -/* 80CA61F0-80CA624C 0016B0 005C+00 1/0 0/0 0/0 .text __dt__10dCcD_GSttsFv */ -// dCcD_GStts::~dCcD_GStts() { -extern "C" void __dt__10dCcD_GSttsFv() { - // NONMATCHING -} - -/* 80CA624C-80CA6250 00170C 0004+00 1/1 0/0 0/0 .text __ct__5csXyzFv */ -// csXyz::csXyz() { -extern "C" void __ct__5csXyzFv() { - /* empty function */ -} - -/* 80CA6250-80CA6254 001710 0004+00 1/1 0/0 0/0 .text __ct__4cXyzFv */ -// cXyz::cXyz() { -extern "C" void __ct__4cXyzFv() { - /* empty function */ +int daObjOCTHASHI_c::create() { + fopAcM_SetupActor(this, daObjOCTHASHI_c); + mPieceNum = fopAcM_GetParam(this) & 0xff; + if (mPieceNum == 0xff) { + mPieceNum = 0; + } + mPieceNum = 8 - mPieceNum; + int iVar1 = mPieceNum * 0x8d3; + int phase = dComIfG_resLoad(&mPhaseReq, l_arcName[0]); + if (phase == cPhs_COMPLEATE_e) { + BOOL is_stage_boss_enemy = dComIfGs_isStageBossEnemy(); + if (is_stage_boss_enemy && dComIfGp_getStartStageRoomNo() == '2') { + if (strcmp("D_MN01A", dComIfGp_getStartStageName()) == 0) { + return cPhs_ERROR_e; + } + } + gravity = -1.0f; + int dzb_id = dComIfG_getObjctResName2Index(l_arcName[0], "S_octhashi00.dzb"); + JUT_ASSERT(958, dzb_id != -1); + phase = MoveBGCreate(l_arcName[0], dzb_id, dBgS_MoveBGProc_TypicalRotY, iVar1, NULL); + if (phase == cPhs_ERROR_e) { + return phase; + } + mSound.init(&eyePos, &eyePos, 3, 1); + field_0x6cb = 0; + fopAcM_SetMtx(this, mpModel[0]->getBaseTRMtx()); + initCcCylinder(); + cXyz pos(current.pos.x, current.pos.y + 100, current.pos.z); + if (fopAcM_gc_c::gndCheck(&pos) & 0xff) { + field_0x6d0 = fopAcM_gc_c::mGroundY; + } + fopAcM_setCullSizeBox(this, -1000.0f, -500.0f, -1000.0f, 1000.0f, 500.0f, 1000.0f); + field_0x6e4 = 7; + daObjOCTHASHI_Execute(this); + } + return phase; } /* 80CA6254-80CA625C 001714 0008+00 1/0 0/0 0/0 .text daObjOCTHASHI_IsDelete__FP15daObjOCTHASHI_c @@ -659,30 +401,40 @@ static bool daObjOCTHASHI_IsDelete(daObjOCTHASHI_c* param_0) { return true; } -/* 80CA625C-80CA62A4 00171C 0048+00 1/0 0/0 0/0 .text __dt__10cCcD_GSttsFv */ -// cCcD_GStts::~cCcD_GStts() { -extern "C" void __dt__10cCcD_GSttsFv() { - // NONMATCHING -} - /* 80CA62A4-80CA62F8 001764 0054+00 1/0 0/0 0/0 .text Create__15daObjOCTHASHI_cFv */ -void daObjOCTHASHI_c::Create() { - // NONMATCHING +int daObjOCTHASHI_c::Create() { + mpBgW->SetRideCallback(rideCallBack); + fopAcM_setCullSizeBox(this, -1000.0f, -500.0f, -1000.0f, 1000.0f, 500.0f, 1000.0f); + return 4; } /* 80CA62F8-80CA636C 0017B8 0074+00 1/0 0/0 0/0 .text Execute__15daObjOCTHASHI_cFPPA3_A4_f */ -void daObjOCTHASHI_c::Execute(f32 (**param_0)[3][4]) { - // NONMATCHING +int daObjOCTHASHI_c::Execute(Mtx **i_mtx) { + Action(); + *i_mtx = &mBgMtx; + setBaseMtx(); + s8 reverb = dComIfGp_getReverb(fopAcM_GetRoomNo(this)); + mSound.framework(0, reverb); + return 1; } /* 80CA636C-80CA6444 00182C 00D8+00 1/0 0/0 0/0 .text Draw__15daObjOCTHASHI_cFv */ -void daObjOCTHASHI_c::Draw() { - // NONMATCHING +int daObjOCTHASHI_c::Draw() { + g_env_light.settingTevStruct(0x10, ¤t.pos, &tevStr); + for (int idx = 0; idx < mPieceNum; ++idx) { + g_env_light.setLightTevColorType_MAJI(mpModel[idx], &tevStr); + } + dComIfGd_setListBG(); + for (int idx = 0; idx < mPieceNum; ++idx) { + mDoExt_modelUpdateDL(mpModel[idx]); + } + return 1; } /* 80CA6444-80CA6478 001904 0034+00 1/0 0/0 0/0 .text Delete__15daObjOCTHASHI_cFv */ -void daObjOCTHASHI_c::Delete() { - // NONMATCHING +int daObjOCTHASHI_c::Delete() { + dComIfG_resDelete(&mPhaseReq, l_arcName[0]); + return 1; } /* 80CA6550-80CA6550 0000D0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */