diff --git a/config/SOUE01/rels/d_a_obj_ringNP/symbols.txt b/config/SOUE01/rels/d_a_obj_ringNP/symbols.txt index 9811e2b5..9ccdbe01 100644 --- a/config/SOUE01/rels/d_a_obj_ringNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_ringNP/symbols.txt @@ -48,7 +48,7 @@ g_profile_OBJ_RING = .data:0x00000000; // type:object size:0x10 data:4byte lbl_193_data_10 = .data:0x00000010; // type:object size:0x8 scope:local lbl_193_data_18 = .data:0x00000018; // type:object size:0x10 scope:local lbl_193_data_28 = .data:0x00000028; // type:object size:0x18 scope:local data:string -ROT_PER_TICK__10dAcOring_c = .data:0x00000040; // type:object size:0x4 data:4byte +lbl_193_data_40 = .data:0x00000040; // type:object size:0x4 scope:local data:4byte __vt__10dAcOring_c = .data:0x00000048; // type:object size:0x80 __vt__49sFStateMgr_c<10dAcOring_c,20sStateMethodUsr_FI_c> = .data:0x000000C8; // type:object size:0x30 __vt__79sStateMgr_c<10dAcOring_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x000000F8; // type:object size:0x30 diff --git a/config/SOUE01/rels/d_t_heat_resistNP/symbols.txt b/config/SOUE01/rels/d_t_heat_resistNP/symbols.txt index 28561637..8a75f83d 100644 --- a/config/SOUE01/rels/d_t_heat_resistNP/symbols.txt +++ b/config/SOUE01/rels/d_t_heat_resistNP/symbols.txt @@ -9,6 +9,6 @@ draw__15dTgHeatResist_cFv = .text:0x000001B0; // type:function size:0x8 __dt__15dTgHeatResist_cFv = .text:0x000001C0; // type:function size:0x5C _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global -@19473 = .rodata:0x00000000; // type:object size:0x4 data:float +lbl_444_rodata_0 = .rodata:0x00000000; // type:object size:0x4 scope:local data:float g_profile_TAG_HEAT_RESIST = .data:0x00000000; // type:object size:0x10 __vt__15dTgHeatResist_c = .data:0x00000010; // type:object size:0x74 diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 43c75774..5021099d 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -166,7 +166,7 @@ d/d_base.cpp: .data start:0x80503380 end:0x805033D0 .sbss start:0x805750C0 end:0x805750CC -d/d_carry.cpp: +d/d_linkage.cpp: .text start:0x80050A20 end:0x80051BF8 align:16 .data start:0x805033D0 end:0x805033E0 .sdata2 start:0x80576ED8 end:0x80576F20 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 68878fa5..65a5b5c8 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2096,19 +2096,19 @@ unloadCallback__7dBase_cFv = .text:0x800509D0; // type:function size:0x4 initLoader__7dBase_cFv = .text:0x800509E0; // type:function size:0x1C createBase__7dBase_cFUsP7dBase_cUlUc = .text:0x80050A00; // type:function size:0x4 createRoot__7dBase_cFUsUlUc = .text:0x80050A10; // type:function size:0x4 -__ct__16ActorCarryStructFv = .text:0x80050A20; // type:function size:0x118 -__dt__16ActorCarryStructFv = .text:0x80050B40; // type:function size:0x80 -set__16ActorCarryStructFUlfffPv = .text:0x80050BC0; // type:function size:0xB4 -actorAttachingRelated = .text:0x80050C80; // type:function size:0x13C -fn_80050DC0 = .text:0x80050DC0; // type:function size:0x34 -fn_80050E00 = .text:0x80050E00; // type:function size:0x34 -fn_80050E40 = .text:0x80050E40; // type:function size:0x60 -fn_80050EA0__16ActorCarryStructFP12dAcObjBase_c = .text:0x80050EA0; // type:function size:0xC -fn_80050EB0__16ActorCarryStructFP12dAcObjBase_c = .text:0x80050EB0; // type:function size:0x140 -bushTpFunc__16ActorCarryStructFR9dBgS_Acch = .text:0x80050FF0; // type:function size:0x19C -fn_80051190__16ActorCarryStructFP12dAcObjBase_c = .text:0x80051190; // type:function size:0x4C -fn_800511E0__16ActorCarryStructFP12dAcObjBase_c = .text:0x800511E0; // type:function size:0x1D8 -isCarriedActor_NotGerock = .text:0x800513C0; // type:function size:0x78 +__ct__10dLinkage_cFv = .text:0x80050A20; // type:function size:0x118 +__dt__10dLinkage_cFv = .text:0x80050B40; // type:function size:0x80 +set__10dLinkage_cFUlfffPv = .text:0x80050BC0; // type:function size:0xB4 +tryAttach__10dLinkage_cFP12dAcObjBase_cP12dAcObjBase_cP12dAcRefBase_cQ210dLinkage_c16ConnectionType_eb = .text:0x80050C80; // type:function size:0x13C +fn_80050DC0__10dLinkage_cFP12dAcObjBase_cff4mAng = .text:0x80050DC0; // type:function size:0x34 +fn_80050E00__10dLinkage_cFP12dAcObjBase_cff4mAng = .text:0x80050E00; // type:function size:0x34 +fn_80050E40__10dLinkage_cFP12dAcObjBase_cff4mAng = .text:0x80050E40; // type:function size:0x60 +fn_80050EA0__10dLinkage_cFP12dAcObjBase_c = .text:0x80050EA0; // type:function size:0xC +fn_80050EB0__10dLinkage_cFP12dAcObjBase_c = .text:0x80050EB0; // type:function size:0x140 +bushTpFunc__10dLinkage_cFR9dBgS_Acch = .text:0x80050FF0; // type:function size:0x19C +fn_80051190__10dLinkage_cFP12dAcObjBase_c = .text:0x80051190; // type:function size:0x4C +fn_800511E0__10dLinkage_cFP12dAcObjBase_c = .text:0x800511E0; // type:function size:0x1D8 +fn_800513C0__10dLinkage_cCFv = .text:0x800513C0; // type:function size:0x78 fn_80051440 = .text:0x80051440; // type:function size:0x17C modifyMtx__13dAcObjRef_unkFv = .text:0x800515C0; // type:function size:0xC fn_800515D0 = .text:0x800515D0; // type:function size:0x60 @@ -12227,7 +12227,7 @@ fn_801F77F0 = .text:0x801F77F0; // type:function size:0x49C fn_801F7C90 = .text:0x801F7C90; // type:function size:0x6C fn_801F7D00 = .text:0x801F7D00; // type:function size:0x28 ActorLink__equipClawshots = .text:0x801F7D30; // type:function size:0x434 -AnimationRelated_ctor2 = .text:0x801F8170; // type:function size:0x3C +__ct__Q23m3d8anmChr_cFv = .text:0x801F8170; // type:function size:0x3C scope:weak isInUsingClawsAnim = .text:0x801F81B0; // type:function size:0x20 ActorLink__UsingClawsFromNotGrouund = .text:0x801F81D0; // type:function size:0x38 fn_801F8210 = .text:0x801F8210; // type:function size:0xB0 @@ -12388,7 +12388,7 @@ fn_80202D80 = .text:0x80202D80; // type:function size:0x8 fn_80202D90__7dAcPy_cFb = .text:0x80202D90; // type:function size:0x48 ActorLink__getTotalNumberOfBombs = .text:0x80202DE0; // type:function size:0x4 ActorLink__changeBombCounterAndPouch = .text:0x80202DF0; // type:function size:0x8 -fn_80202E00 = .text:0x80202E00; // type:function size:0x7C +fn_80202E00__7dAcPy_cFP13cBgS_PolyInfoff = .text:0x80202E00; // type:function size:0x7C fn_80202E80 = .text:0x80202E80; // type:function size:0x80 fn_80202F00 = .text:0x80202F00; // type:function size:0x90 isInLiftingSmallObjectAnim = .text:0x80202F90; // type:function size:0x38 @@ -12998,7 +12998,7 @@ fn_80230220 = .text:0x80230220; // type:function size:0x24 fn_80230250 = .text:0x80230250; // type:function size:0x60 fn_802302B0 = .text:0x802302B0; // type:function size:0x8 ActorLink__equipWhip = .text:0x802302C0; // type:function size:0x4B0 -fn_80230770 = .text:0x80230770; // type:function size:0x1C +getWhippedItem__7dAcPy_cFv = .text:0x80230770; // type:function size:0x1C ActorLink__GetWhipTip = .text:0x80230790; // type:function size:0x44 ActorLink__GetWhipBase = .text:0x802307E0; // type:function size:0x40 fn_80230820 = .text:0x80230820; // type:function size:0x7C @@ -14043,7 +14043,7 @@ __dt__23sFState_c<10dAcArrow_c>Fv = .text:0x8025D6F0; // type:function size:0x58 __dt__26sFStateFct_c<10dAcArrow_c>Fv = .text:0x8025D750; // type:function size:0x6C __dt__79sStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8025D7C0; // type:function size:0xA0 __dt__49sFStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c>Fv = .text:0x8025D860; // type:function size:0xA4 -hitCallback__FP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x8025D910; // type:function size:0x24 +dAcArrow_atHitCallback__FP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x8025D910; // type:function size:0x24 createHeap__10dAcArrow_cFv = .text:0x8025D940; // type:function size:0x90 create__10dAcArrow_cFv = .text:0x8025D9D0; // type:function size:0x184 changeState__79sStateMgr_c<10dAcArrow_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8025DB60; // type:function size:0x10 @@ -14099,16 +14099,16 @@ fn_80260790 = .text:0x80260790; // type:function size:0x30 __sinit_\d_a_obj_arrow_cpp = .text:0x802607C0; // type:function size:0x490 scope:local __dt__25sFStateID_c<10dAcArrow_c>Fv = .text:0x80260C50; // type:function size:0x58 isSameName__25sFStateID_c<10dAcArrow_c>CFPCc = .text:0x80260CB0; // type:function size:0x88 -AcBoomerang__ctor = .text:0x80260D40; // type:function size:0x1CC -fn_80260F10 = .text:0x80260F10; // type:function size:0x5C -fn_80260F70 = .text:0x80260F70; // type:function size:0x58 -fn_80260FD0 = .text:0x80260FD0; // type:function size:0x6C -fn_80261040 = .text:0x80261040; // type:function size:0xA0 -fn_802610E0 = .text:0x802610E0; // type:function size:0xA4 -fn_80261190 = .text:0x80261190; // type:function size:0x18 -AcBoomerang__grabItem = .text:0x802611B0; // type:function size:0x290 +dAcBoomerang_c_classInit__Fv = .text:0x80260D40; // type:function size:0x1CC +__dt__18dAcBoomerangProc_cFv = .text:0x80260F10; // type:function size:0x5C +__dt__27sFState_c<14dAcBoomerang_c>Fv = .text:0x80260F70; // type:function size:0x58 +__dt__30sFStateFct_c<14dAcBoomerang_c>Fv = .text:0x80260FD0; // type:function size:0x6C +__dt__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80261040; // type:function size:0xA0 +__dt__53sFStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c>Fv = .text:0x802610E0; // type:function size:0xA4 +areaCallback__FP12dAcObjBase_cP7mVec3_cUl = .text:0x80261190; // type:function size:0x18 +hitCallback__14dAcBoomerang_cFP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x802611B0; // type:function size:0x290 fn_80261440 = .text:0x80261440; // type:function size:0x10 -AcBoomerang__grabItem_func = .text:0x80261450; // type:function size:0x24 +dAcBoomerang_atHitCallback__FP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x80261450; // type:function size:0x24 AcBoomerang__assignBeetleModel = .text:0x80261480; // type:function size:0x5C AcBoomerang__initModels = .text:0x802614E0; // type:function size:0x310 AcBoomerang__init = .text:0x802617F0; // type:function size:0x208 @@ -14129,7 +14129,7 @@ fn_80262AC0 = .text:0x80262AC0; // type:function size:0x120 fn_80262BE0 = .text:0x80262BE0; // type:function size:0x1E0 fn_80262DC0 = .text:0x80262DC0; // type:function size:0x13C fn_80262F00 = .text:0x80262F00; // type:function size:0x2C -fn_80262F30 = .text:0x80262F30; // type:function size:0x154 +setChrAnimation__14dAcBoomerang_cFQ214dAcBoomerang_c14ChrAnimation_e = .text:0x80262F30; // type:function size:0x154 fn_80263090 = .text:0x80263090; // type:function size:0xE4 fn_80263180 = .text:0x80263180; // type:function size:0x50 fn_802631D0 = .text:0x802631D0; // type:function size:0x8C @@ -14168,7 +14168,7 @@ fn_80265070 = .text:0x80265070; // type:function size:0x10 fn_80265080 = .text:0x80265080; // type:function size:0x30 fn_802650B0 = .text:0x802650B0; // type:function size:0x30 fn_802650E0 = .text:0x802650E0; // type:function size:0x30 -AcBoomerang__initStates = .text:0x80265110; // type:function size:0x41C +__sinit_\d_a_obj_boomerang_cpp = .text:0x80265110; // type:function size:0x41C AcBoomerang__dtor2 = .text:0x80265530; // type:function size:0x58 fn_80265590 = .text:0x80265590; // type:function size:0x88 dAcObjFairy_c_classInit__Fv = .text:0x80265620; // type:function size:0x144 @@ -35811,12 +35811,12 @@ lbl_80534B1C = .data:0x80534B1C; // type:object size:0x1C data:string lbl_80534B38 = .data:0x80534B38; // type:object size:0xC lbl_80534B44 = .data:0x80534B44; // type:object size:0xC lbl_80534B50 = .data:0x80534B50; // type:object size:0x10 -AcBoomerang__vtable = .data:0x80534B60; // type:object size:0x80 -lbl_80534BE0 = .data:0x80534BE0; // type:object size:0x30 -lbl_80534C10 = .data:0x80534C10; // type:object size:0x30 -lbl_80534C40 = .data:0x80534C40; // type:object size:0x18 -lbl_80534C58 = .data:0x80534C58; // type:object size:0x18 -lbl_80534C70 = .data:0x80534C70; // type:object size:0x1D0 +__vt__14dAcBoomerang_c = .data:0x80534B60; // type:object size:0x80 +__vt__53sFStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c> = .data:0x80534BE0; // type:object size:0x30 +__vt__83sStateMgr_c<14dAcBoomerang_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80534C10; // type:object size:0x30 +__vt__30sFStateFct_c<14dAcBoomerang_c> = .data:0x80534C40; // type:object size:0x18 +__vt__27sFState_c<14dAcBoomerang_c> = .data:0x80534C58; // type:object size:0x18 +__vt__18dAcBoomerangProc_c = .data:0x80534C70; // type:object size:0x1D0 lbl_80534E40 = .data:0x80534E40; // type:object size:0x38 g_profile_OBJ_FAIRY = .data:0x80534E78; // type:object size:0x68 lbl_80534EE0 = .data:0x80534EE0; // type:object size:0x30 diff --git a/configure.py b/configure.py index fd6000f6..5f129583 100644 --- a/configure.py +++ b/configure.py @@ -399,7 +399,7 @@ config.libs = [ Object(NonMatching, "d/a/npc/d_a_ordinary_npc.cpp"), Object(NonMatching, "d/d_ac_npc_kyui.cpp"), Object(Matching, "d/d_base.cpp"), - Object(NonMatching, "d/d_carry.cpp"), + Object(NonMatching, "d/d_linkage.cpp"), Object(Matching, "d/d_cc.cpp"), Object(Matching, "d/d_dvd.cpp"), Object(Matching, "d/d_dvd_drive_error.cpp"), diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index e27a3513..324e27bf 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -2,6 +2,8 @@ #define D_A_PLAYER_H #include "common.h" +#include "d/a/d_a_item.h" +#include "d/col/c/c_bg_s_poly_info.h" #include "d/d_player_mdl.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/minigame_mgr.h" @@ -17,6 +19,9 @@ public: // argument is always false in existing code, true doesn't seem to make a difference void bonk(bool unk = false); bool fn_80202D90(bool); + void fn_80202E00(cBgS_PolyInfo *, f32, f32); + + dAcItem_c *getWhippedItem(); /* overrides omitted */ /* vt 0x310 */ virtual void vt_0x310(); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index e27a4930..c8e1cd80 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -1,12 +1,13 @@ #ifndef D_A_OBJ_BASE_H #define D_A_OBJ_BASE_H +#include "c/c_math.h" #include "common.h" #include "d/a/d_a_base.h" #include "d/col/c/c_cc_d.h" #include "d/col/c/c_m3d_g_aab.h" -#include "d/col/c/c_m3d_g_lin.h" #include "d/d_jnt_col.h" +#include "d/d_linkage.h" #include "egg/math/eggMath.h" #include "m/m3d/m_shadow.h" #include "m/m3d/m_smdl.h" @@ -16,54 +17,6 @@ #include "m/m_vec.h" #include "m/types_m.h" -class dAcObjBase_c; -class dBgS_Acch; - -// Size: 0xA8 -struct ActorCarryStruct { - /* 0x00 */ dAcRefBase_c actorLink; - /* 0x0C */ fLiNdBa_c *carriedActor; - /* 0x10 */ u32 carryFlags; - /* 0x14 */ int carryType; - /* 0x18 */ u16 field_0x18; - /* 0x1A */ u16 field_0x1A; - /* 0x1C */ mVec3_c field_0x1C; - /* 0x28 */ mMtx_c carryTransMtx; - /* 0x58 */ mMtx_c field_0x58; - /* 0x88 */ s32 isCarried; - /* 0x8C */ f32 field_0x8C; - /* 0x90 */ f32 field_0x90; - /* 0x94 */ f32 field_0x94; - /* 0x98 */ f32 field_0x98; - - ActorCarryStruct(); - /* vt 0x9C */ - virtual ~ActorCarryStruct(); - /* 0xA0 */ dJntCol_c *field_0xA0; - /* 0xA4 */ u32 field_0xA4; - - void set(u32 flags, f32 x, f32 y, f32 z, void *unk); - - // not real name, but sure - void bushTpFunc(dBgS_Acch &); - - void fn_80050EA0(dAcObjBase_c *); - void fn_800511E0(dAcObjBase_c *); - void fn_80051190(dAcObjBase_c *); - void fn_80050EB0(dAcObjBase_c *); - - // This will attach pObj onto pOwner, returning if it could attach - bool tryAttachWithRef(dAcObjBase_c *pObj, dAcObjBase_c *pOwner, dAcRefBase_c *pRefLink, int, bool); - - bool testCarryFlag(u32 flag) { - return (carryFlags & flag) != 0; - } - - bool checkCarryType(int type) const { - return (isCarried == 1 && carryType == type); - } -}; - // Ghidra has it as `unk_ActorObjectBase` struct LightingInfo { /* 0x00 */ u8 mField_0x00[0x40 - 0x00]; @@ -121,7 +74,7 @@ public: /* 0x1C0 */ cCcD_Stts mStts; /* 0x1FC */ mVec3_c mStartingPos; /* 0x208 */ mAng3_c mStartingRot; - /* 0x210 */ ActorCarryStruct mActorCarryInfo; + /* 0x210 */ dLinkage_c mLinkage; /* 0x2B8 */ u32 mField_0x2B8; /* 0x2BC */ LightingInfo mLightingInfo; /* 0x32C */ u32 mField_0x32C; @@ -145,6 +98,10 @@ public: return forwardSpeed; } + f32 GetYOffset() const { + return yoffset; + } + bool isStopped() const { return getVelocityMag() <= EGG::Math::epsilon(); } @@ -167,8 +124,15 @@ public: return mObjectActorFlags & property; } + dLinkage_c &GetLinkage() { + return mLinkage; + } + const dLinkage_c &GetLinkage() const { + return mLinkage; + } + void SetJntCol(dJntCol_c *pCol) { - mActorCarryInfo.field_0xA0 = pCol; + mLinkage.field_0xA0 = pCol; } // could be their own thing? diff --git a/include/d/a/obj/d_a_obj_boomerang.h b/include/d/a/obj/d_a_obj_boomerang.h new file mode 100644 index 00000000..3b2a6261 --- /dev/null +++ b/include/d/a/obj/d_a_obj_boomerang.h @@ -0,0 +1,120 @@ +#ifndef D_A_OBJ_BOOMERANG_H +#define D_A_OBJ_BOOMERANG_H + +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_shadow.h" +#include "d/lyt/d_lyt_fader.h" +#include "m/m3d/m_anmchr.h" +#include "m/m3d/m_anmchrblend.h" +#include "m/m3d/m_mdl.h" +#include "m/m3d/m_proc.h" +#include "m/m_color.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "s/s_State.hpp" +#include "toBeSorted/actor_event.h" +#include "toBeSorted/d_emitter.h" + +class dAcBoomerangProcBase_c : public m3d::proc_c { +public: + ~dAcBoomerangProcBase_c() {} +}; +class dAcBoomerangProc_c : public dAcBoomerangProcBase_c { +public: + dAcBoomerangProc_c() : mColor0(0), mColor1(0xFFFFFFFF) {} + ~dAcBoomerangProc_c() {} + + virtual void drawOpa() override; + + mColor mColor0; + mColor mColor1; +}; + +class dAcBoomerang_c : public dAcObjBase_c { +public: + dAcBoomerang_c() + : mStateMgr(*this), + mEventRelated(*this, nullptr), + mEff0(this), + mEff1(this), + mEff2(this), + mEff3(this), + mLytFader(0, dLytFader_c::FADED_OUT) {} + virtual ~dAcBoomerang_c(); + + virtual int create() override; + virtual int doDelete() override; + virtual int draw() override; + virtual void deleteReady() override; + virtual bool createHeap() override; + virtual int actorExecute() override; + virtual void registerInEvent() override; + + STATE_FUNC_DECLARE(dAcBoomerang_c, Wait); + STATE_FUNC_DECLARE(dAcBoomerang_c, Move); + STATE_FUNC_DECLARE(dAcBoomerang_c, MoveCancelWait); + STATE_FUNC_DECLARE(dAcBoomerang_c, ReturnWait); + STATE_FUNC_DECLARE(dAcBoomerang_c, EventReturnWait); + +public: // TYPES + struct ChrAnimation_t { + const char *mName; + f32 mRate; + }; + enum ChrAnimation_e { + RB_SET = 0, + RB_DEFAULT = 1, + RB_CUT = 2, + RB_HOLD = 3, + RB_HOLD_ED = 4, + RB_BACK = 5, + RB_MAX, + }; + static const ChrAnimation_t sChrAnims[RB_MAX]; + +public: // INLINES + bool checkField_0x8CC(u32 mask) { + return field_0x8CC & mask; + } + +public: // FUNCTIONS + void atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB); + + bool tryGrabObject(dAcObjBase_c *pObject); + void setChrAnimation(ChrAnimation_e requestedAnimation); + +private: + /* 0x0330 */ nw4r::g3d::ResFile mResFile; + /* 0x0334 */ m3d::mdl_c mMdl; + /* 0x0358 */ m3d::anmChrBlend_c mAnmChrBlend; + /* 0x0380 */ m3d::anmChr_c mAnmChr[2]; + /* 0x03F0 */ dAcBoomerangProc_c mProc; + /* 0x0410 */ dShadowCircle_c mShadow; + /* 0x0418 */ dAcRef_c mGrabbedActor; + /* 0x0424 */ u8 _0x424[0x454 - 0x424]; + /* 0x0454 */ dBgS_Acch mAcch; + /* 0x0804 */ dBgS_AcchCir mAcchCir; + /* 0x0860 */ ActorEventRelated mEventRelated; + /* 0x08B0 */ u8 mCurrentAnimation; + /* 0x08B1 */ u8 _0x8B1[0x8B5 - 0x8B1]; + /* 0x08B5 */ u8 mWindNodeID; + /* 0x08B6 */ u8 mLeftWingNodeID; + /* 0x08B7 */ u8 mRightWingNodeID; + /* 0x08B8 */ u8 _0x8B8[0x8CC - 0x8B8]; + /* 0x08B8 */ u32 field_0x8CC; + /* 0x08D0 */ u8 _0x8D0[0x8FC - 0x8D0]; + /* 0x08FC */ dCcD_Sph mSph0; + /* 0x0A4C */ dCcD_Sph mSph1; + /* 0x0B9C */ EffectsStruct mEff0; + /* 0x0BD0 */ EffectsStruct mEff1; + /* 0x0C04 */ EffectsStruct mEff2; + /* 0x0C38 */ EffectsStruct mEff3; + /* 0x0C6C */ dLytFader_c mLytFader; + /* 0x114C */ u8 _0x114C[0x115C - 0x114C]; + /* 0x115C */ STATE_MGR_DECLARE(dAcBoomerang_c); +}; + +#endif diff --git a/include/d/a/obj/d_a_obj_ring.h b/include/d/a/obj/d_a_obj_ring.h index f43c2f40..232da7d1 100644 --- a/include/d/a/obj/d_a_obj_ring.h +++ b/include/d/a/obj/d_a_obj_ring.h @@ -4,7 +4,6 @@ #include "d/a/obj/d_a_obj_base.h" #include "m/m3d/m_smdl.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" class dAcOring_c : public dAcObjBase_c { public: @@ -24,8 +23,6 @@ public: } private: - static u32 ROT_PER_TICK; - m3d::smdl_c mModel; STATE_MGR_DECLARE(dAcOring_c); u8 field_0x388; diff --git a/include/d/a/obj/d_a_obj_switch.h b/include/d/a/obj/d_a_obj_switch.h index df5b2d54..7a3b67a0 100644 --- a/include/d/a/obj/d_a_obj_switch.h +++ b/include/d/a/obj/d_a_obj_switch.h @@ -3,9 +3,9 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_w.h" +#include "d/flag/sceneflag_manager.h" #include "m/m3d/m_mdl.h" #include "s/s_State.hpp" -#include "s/s_StateMgr.hpp" #include "toBeSorted/time_area_mgr.h" // OBJ_VSD? @@ -63,6 +63,10 @@ public: static void rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObjBase_c *interactor); + bool checkOnFlag() { + return mOnSceneFlag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(roomid, mOnSceneFlag); + } + private: /* 0x330 */ m3d::mdl_c mModel; /* 0x354 */ dBgW mCollision; diff --git a/include/d/a/obj/d_a_obj_tubo.h b/include/d/a/obj/d_a_obj_tubo.h index 82f26102..1b23f088 100644 --- a/include/d/a/obj/d_a_obj_tubo.h +++ b/include/d/a/obj/d_a_obj_tubo.h @@ -11,6 +11,7 @@ #include "d/d_shadow.h" #include "d/flag/sceneflag_manager.h" #include "m/m3d/m_smdl.h" +#include "m/m_angle.h" #include "m/m_quat.h" #include "m/m_vec.h" #include "nw4r/g3d/res/g3d_resfile.h" diff --git a/include/d/col/bg/d_bg_s_acch.h b/include/d/col/bg/d_bg_s_acch.h index c21a4bd3..6682fac3 100644 --- a/include/d/col/bg/d_bg_s_acch.h +++ b/include/d/col/bg/d_bg_s_acch.h @@ -292,7 +292,7 @@ public: bool ChkLineCheckNone() { return mFlags & LINE_CHECK_NONE; } - bool ChkLineCheck() { + bool ChkLineCheck() const { return mFlags & LINE_CHECK; } bool Chk_0x4000000() const { diff --git a/include/d/d_linkage.h b/include/d/d_linkage.h new file mode 100644 index 00000000..fd6fcc39 --- /dev/null +++ b/include/d/d_linkage.h @@ -0,0 +1,106 @@ +#ifndef D_LINKAGE_H +#define D_LINKAGE_H + +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/d_jnt_col.h" +#include "m/m_angle.h" +#include "m/m_mtx.h" + +class dAcObjBase_c; +class dBgS_Acch; + +// Previously Known as `ActorCarryStruct` +// Size: 0xA8 +class dLinkage_c { +public: + dLinkage_c(); + +public: + enum ConnectionType_e { + CONNECTION_0 = 0, + CONNECTION_1 = 1, + CONNECTION_2 = 2, + CONNECTION_3 = 3, + CONNECTION_4 = 4, + CONNECTION_5 = 5, + CONNECTION_6 = 6, + CONNECTION_7 = 7, + CONNECTION_8 = 8, + CONNECTION_9 = 9, + }; + enum State_e { + STATE_0 = 0, + STATE_ACTIVE = 1, + STATE_2 = 2, // Hold? + STATE_3 = 3, // Roll? + STATE_DELETE = 4, + }; + enum Flag_e { + }; + +public: + void onFlag(u32 flag) { + carryFlags |= flag; + } + void offFlag(u32 flag) { + carryFlags &= ~flag; + } + bool checkFlag(u32 flag) const { + return (carryFlags & flag) != 0; + } + + // Int Required on return -> will use enum when possible + int getState() const { + return mState; + } + + bool checkState(State_e state) const { + return mState == state; + } + + bool checkType_1_3_5_6_9() const { + return mType == CONNECTION_1 || mType == CONNECTION_3 || mType == CONNECTION_5 || mType == CONNECTION_6 || + mType == CONNECTION_9; + } + + bool checkConnection(ConnectionType_e type) const { + return (checkState(STATE_ACTIVE) && mType == type); + } + +public: + void set(u32 flags, f32, f32, f32, void *unk); + bool tryAttach(dAcObjBase_c *, dAcObjBase_c *, dAcRefBase_c *, ConnectionType_e, bool); + void fn_80050DC0(dAcObjBase_c *, f32, f32, mAng); + void fn_80050E00(dAcObjBase_c *, f32, f32, mAng); + void fn_80050E40(dAcObjBase_c *, f32, f32, mAng); + void fn_80050EA0(dAcObjBase_c *); + void fn_800511E0(dAcObjBase_c *); + void bushTpFunc(dBgS_Acch &); + void fn_80051190(dAcObjBase_c *); + void fn_80050EB0(dAcObjBase_c *); + bool fn_800513C0() const; + +public: + /* 0x00 */ dAcRefBase_c mControllingActor; + /* 0x0C */ dAcRefBase_c *pLinkedActor; + /* 0x10 */ u32 carryFlags; + /* 0x14 */ ConnectionType_e mType; + /* 0x18 */ u16 field_0x18; + /* 0x1A */ u16 field_0x1A; + /* 0x1C */ f32 field_0x1C; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ mMtx_c carryTransMtx; + /* 0x58 */ mMtx_c field_0x58; + /* 0x88 */ State_e mState; + /* 0x8C */ f32 field_0x8C; + /* 0x90 */ f32 field_0x90; + /* 0x94 */ f32 field_0x94; + /* 0x98 */ f32 field_0x98; + /* 0x9C vt*/ virtual ~dLinkage_c(); // usually i would like functions sepearte, but this is the placement. + /* 0xA0 */ dJntCol_c *field_0xA0; + /* 0xA4 */ u32 field_0xA4; +}; + +#endif diff --git a/include/m/m_angle.h b/include/m/m_angle.h index 31135add..0bf080f4 100644 --- a/include/m/m_angle.h +++ b/include/m/m_angle.h @@ -179,6 +179,10 @@ public: y.mVal += (s16)val; } + void addX(const s32 &fx) { + x += fx; + } + mAng x, y, z; static mAng3_c Zero; diff --git a/src/REL/d/a/e/d_a_e_sm.cpp b/src/REL/d/a/e/d_a_e_sm.cpp index fe3c7514..dae7f886 100644 --- a/src/REL/d/a/e/d_a_e_sm.cpp +++ b/src/REL/d/a/e/d_a_e_sm.cpp @@ -16,6 +16,7 @@ #include "d/col/cc/d_cc_s.h" #include "d/d_camera.h" #include "d/d_jnt_col.h" +#include "d/d_linkage.h" #include "d/d_sc_game.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" @@ -629,7 +630,7 @@ int dAcEsm_c::actorExecute() { dAcBomb_c *bomb = getBombWithinRadius(lookRadius); if (bomb != nullptr && std::abs(bomb->GetPosition().y - mHomePos1.y) < 0.7f * lookRadius) { - if (bomb->mActorCarryInfo.tryAttachWithRef(bomb, this, &mBombRef, 1, false)) { + if (bomb->GetLinkage().tryAttach(bomb, this, &mBombRef, dLinkage_c::CONNECTION_1, false)) { mTimer_0xBAE = 160; playSound(SE_ESm_BRING_IN); clearActorProperty(1); diff --git a/src/REL/d/a/obj/d_a_obj_ring.cpp b/src/REL/d/a/obj/d_a_obj_ring.cpp index 554a9d35..7d52f2bb 100644 --- a/src/REL/d/a/obj/d_a_obj_ring.cpp +++ b/src/REL/d/a/obj/d_a_obj_ring.cpp @@ -1,6 +1,8 @@ #include "d/a/obj/d_a_obj_ring.h" #include "d/a/d_a_player.h" +#include "d/d_linkage.h" +#include "m/m_angle.h" #include "nw4r/g3d/res/g3d_resfile.h" SPECIAL_ACTOR_PROFILE(OBJ_RING, dAcOring_c, fProfile::OBJ_RING, 0x00f2, 0, 0x103); @@ -10,7 +12,6 @@ STATE_DEFINE(dAcOring_c, Move); bool dAcOring_c::createHeap() { nw4r::g3d::ResFile f(getOarcResFile("PRing")); nw4r::g3d::ResMdl mdl = f.GetResMdl("PeehatRing"); - // This matches but in a really weird way. Maybe an inline function? TRY_CREATE(mModel.create(mdl, &heap_allocator, 0x20, 1, nullptr)); return true; } @@ -52,18 +53,11 @@ int dAcOring_c::draw() { void dAcOring_c::initializeState_Move() {} -u32 dAcOring_c::ROT_PER_TICK = 0x1000; - void dAcOring_c::executeState_Move() { - bool isCarried = false; - if (mActorCarryInfo.isCarried == 1 && mActorCarryInfo.carryType == 7) { - isCarried = true; - } - - if (isCarried) { + if (GetLinkage().checkConnection(dLinkage_c::CONNECTION_7)) { return; } - rotation.x.mVal += ROT_PER_TICK; + rotation.addX(0x1000); if (field_0x38C >= position.y) { deleteRequest(); } diff --git a/src/REL/d/a/obj/d_a_obj_tubo.cpp b/src/REL/d/a/obj/d_a_obj_tubo.cpp index 2c6d42ec..bfcb4ba7 100644 --- a/src/REL/d/a/obj/d_a_obj_tubo.cpp +++ b/src/REL/d/a/obj/d_a_obj_tubo.cpp @@ -17,6 +17,7 @@ #include "d/col/c/c_cc_d.h" #include "d/col/c/c_m3d_g_pla.h" #include "d/col/cc/d_cc_s.h" +#include "d/d_linkage.h" #include "d/flag/dungeonflag_manager.h" #include "d/flag/sceneflag_manager.h" #include "egg/math/eggMath.h" @@ -104,11 +105,11 @@ int dAcOtubo_c::actorCreate() { mStateMgr.changeState(StateID_Wait); boundingBox.Set(mVec3_c(-100.f, -40.f, -100.f), mVec3_c(100.f, 80.f, 100.f)); - mActorCarryInfo.set(0xC8A0, 28.f, 50.f, 28.f, nullptr); // TODO (ActorCarry Flags) - mActorCarryInfo.field_0x8C = 26.f; - mActorCarryInfo.field_0x90 = 46.f; - mActorCarryInfo.field_0x94 = 28.f; - mActorCarryInfo.field_0x98 = 0.f; + GetLinkage().set(0xC8A0, 28.f, 50.f, 28.f, nullptr); // TODO (ActorCarry Flags) + GetLinkage().field_0x8C = 26.f; + GetLinkage().field_0x90 = 46.f; + GetLinkage().field_0x94 = 28.f; + GetLinkage().field_0x98 = 0.f; return SUCCEEDED; } @@ -166,7 +167,7 @@ int dAcOtubo_c::actorExecute() { mField_0x9DC += position.y - mOldPosition.y; adjustRoll(); } - mActorCarryInfo.bushTpFunc(mObjAcch); + GetLinkage().bushTpFunc(mObjAcch); } if (mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Slope)) { @@ -175,7 +176,7 @@ int dAcOtubo_c::actorExecute() { mSph.SetC(getCenter()); dCcS::GetInstance()->Set(&mSph); - mActorCarryInfo.fn_800511E0(this); + GetLinkage().fn_800511E0(this); mField_0x8F0.modifyMtx(); calcRoll(); @@ -283,28 +284,23 @@ void dAcOtubo_c::executeState_Grab() { dAcNpcCeLady_c *lady = mCeLady.get(); dAcNpcCeFriend_c *ceFriend = mCeFriend.get(); if (ceFriend && ceFriend->fn_11_17C0(this)) { - mActorCarryInfo.fn_80050EA0(this); + GetLinkage().fn_80050EA0(this); } else if (lady && lady->fn_12_1C20(this)) { - mActorCarryInfo.fn_80050EA0(this); + GetLinkage().fn_80050EA0(this); } } - if (mActorCarryInfo.checkCarryType(5) && sLib::calcTimer(&mTimer_0x9F5) == 0 && + if (GetLinkage().checkConnection(dLinkage_c::CONNECTION_5) && sLib::calcTimer(&mTimer_0x9F5) == 0 && (mObjAcch.ChkGndHit() || mObjAcch.ChkWallHit(nullptr) || mObjAcch.ChkRoofHit())) { destroy(); - } else if (dAcPy_c::LINK->getCurrentAction() == 66 /* Put Down Medium */) { // TODO (Link Action ID) + } else if (dAcPy_c::GetLink()->getCurrentAction() == 66 /* Put Down Medium */) { // TODO (Link Action ID) mStateMgr.changeState(StateID_Put); } else { - if (mActorCarryInfo.isCarried != 4) { - bool isCarried = false; - if (mActorCarryInfo.isCarried == 1 && mActorCarryInfo.carryType == 5) { - isCarried = true; - } - - if (isCarried) { - mField_0x9F6 = 0; + if (!GetLinkage().checkState(dLinkage_c::STATE_DELETE)) { + if (GetLinkage().checkConnection(dLinkage_c::CONNECTION_5)) { + mField_0x9F6 = dLinkage_c::STATE_0; } else { - mField_0x9F6 = mActorCarryInfo.isCarried; + mField_0x9F6 = GetLinkage().getState(); } } @@ -320,7 +316,7 @@ void dAcOtubo_c::finalizeState_Grab() { } mField_0x9D4 = cM::rndF(40.f); mSph.ClrCo_0x400(); - if ((u8)mActorCarryInfo.isCarried == 2) { + if ((u8)GetLinkage().mState == 2) { mSph.OnAtSet(); } mObjAcch.ClrRoofNone(); @@ -407,7 +403,7 @@ void dAcOtubo_c::initializeState_Rebirth() { mSph.ClrCoSet(); mSph.ClrTgSet(); setObjectProperty(0x200); - mActorCarryInfo.fn_80050EA0(this); + GetLinkage().fn_80050EA0(this); int item_drop_table = getParams2UpperByte(); switch (item_drop_table) { @@ -456,7 +452,7 @@ void dAcOtubo_c::destroy() { return; } fn_80022BE0(BlurAndPaletteManager::GetPInstance(), position); - mActorCarryInfo.fn_80050EA0(this); + GetLinkage().fn_80050EA0(this); dEmitterBase_c *fx_thing = dJEffManager_c::spawnEffect( PARTICLE_RESOURCE_ID_MAPPING_211_, poscopy2, nullptr, nullptr, nullptr, nullptr, 0, 0 @@ -651,7 +647,7 @@ void dAcOtubo_c::attemptDestroy() { mField_0x9DC = 0.f; } if (!mObjAcch.ChkGndHit() && mSph.ChkCoHit()) { - if (mActorCarryInfo.isCarried != 1 && forwardSpeed > 0.f) { + if (GetLinkage().mState != 1 && forwardSpeed > 0.f) { if (mSph.GetCoActor()->unkByteTargetFiRelated == 4) { destroy(); return; @@ -807,7 +803,9 @@ bool dAcOtubo_c::checkOnLava() { } bool dAcOtubo_c::checkCarryType() const { - return mActorCarryInfo.checkCarryType(1) || mActorCarryInfo.checkCarryType(7) || mActorCarryInfo.checkCarryType(5); + const dLinkage_c &linkage = GetLinkage(); + return linkage.checkConnection(dLinkage_c::CONNECTION_1) || linkage.checkConnection(dLinkage_c::CONNECTION_7) || + linkage.checkConnection(dLinkage_c::CONNECTION_5); } bool dAcOtubo_c::checkSubmerged() { diff --git a/src/d/a/obj/d_a_obj_arrow.cpp b/src/d/a/obj/d_a_obj_arrow.cpp index 42e1965d..2b9bbb57 100644 --- a/src/d/a/obj/d_a_obj_arrow.cpp +++ b/src/d/a/obj/d_a_obj_arrow.cpp @@ -1,7 +1,6 @@ #include "d/a/obj/d_a_obj_arrow.h" #include "c/c_math.h" -#include "d/a/d_a_player.h" #include "d/col/c/c_cc_d.h" #include "nw4r/types_nw4r.h" @@ -38,7 +37,7 @@ const dCcD_SrcSph dAcArrow_c::sCc2 = { // clang-format on -bool hitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) { +bool dAcArrow_atHitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) { static_cast(i_actorA)->hitCallback(i_objInfA, i_actorB, i_objInfB); return true; } @@ -70,7 +69,7 @@ int dAcArrow_c::create() { mCcCps.Set(sCc1); mCcCps.SetStts(mStts); mCcCps.SetAtFlag(0x2000); - mCcCps.SetAtCallback(::hitCallback); + mCcCps.SetAtCallback(dAcArrow_atHitCallback); mCcSph.Set(sCc2); mCcSph.SetStts(mStts); diff --git a/src/d/a/obj/d_a_obj_boomerang.cpp b/src/d/a/obj/d_a_obj_boomerang.cpp new file mode 100644 index 00000000..1f908925 --- /dev/null +++ b/src/d/a/obj/d_a_obj_boomerang.cpp @@ -0,0 +1,95 @@ +#include "d/a/obj/d_a_obj_boomerang.h" + +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_fanm.h" +#include "nw4r/g3d/g3d_anmchr.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "s/s_State.hpp" + +SPECIAL_ACTOR_PROFILE(BOOMERANG, dAcBoomerang_c, fProfile::BOOMERANG, 0x125, 0, 0x4); + +STATE_DEFINE(dAcBoomerang_c, Wait); +STATE_DEFINE(dAcBoomerang_c, Move); +STATE_DEFINE(dAcBoomerang_c, MoveCancelWait); +STATE_DEFINE(dAcBoomerang_c, ReturnWait); +STATE_DEFINE(dAcBoomerang_c, EventReturnWait); + +const dAcBoomerang_c::ChrAnimation_t dAcBoomerang_c::sChrAnims[dAcBoomerang_c::RB_MAX] = { + { "RB_Set", 0.f}, + {"RB_Default", 3.f}, + { "RB_Cut", 3.f}, + { "RB_Hold", 3.f}, + {"RB_Hold_ed", 3.f}, + { "RB_Back", 3.f}, +}; + +void areaCallback(dAcObjBase_c *param0, mVec3_c *param1, u32 param2) { + if (param2 != 0) { + return; + } +} + +void dAcBoomerang_c::atHitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB) { + if (i_actorB != nullptr && GetLinkage().checkFlag(0x80)) { + if (dAcPy_c::getCurrentBeetleType() > 2) { + if (i_actorB == mGrabbedActor.get()) { + return; + } + + if (!mStateMgr.isState(StateID_Move)) { + return; + } + + if (tryGrabObject(i_actorB)) { + setChrAnimation(RB_HOLD); + mAnmChr[0].setRate(0.f); + mAnmChr[0].setFrameOnly(i_actorB->GetLinkage().field_0x24); + } + } + } +} + +bool dAcBoomerang_atHitCallback( + dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB +) { + static_cast(i_actorA)->atHitCallback(i_objInfA, i_actorB, i_objInfB); + return true; +} + +// ... + +bool dAcBoomerang_c::tryGrabObject(dAcObjBase_c *pObj) { + dAcPy_c *player = dAcPy_c::GetLink2(); + if (checkField_0x8CC(0x1000) && GetLinkage().checkFlag(0x80)) {} +} + +// ... + +void dAcBoomerang_c::setChrAnimation(dAcBoomerang_c::ChrAnimation_e requestedAnimation) { + // Do not set anim if there is no change, or the request is to cut from hold + if (requestedAnimation == mCurrentAnimation || (mCurrentAnimation == RB_HOLD && requestedAnimation == RB_CUT)) { + return; + } + + mAnmChr[0].setAnm(mMdl, mResFile.GetResAnmChr(sChrAnims[requestedAnimation].mName), m3d::PLAY_MODE_4); + nw4r::g3d::AnmObjChr *pAnmObj = static_cast(mAnmChr[0].getAnimObj()); + + pAnmObj->Release(); + + nw4r::g3d::ResMdl mdl = mMdl.getResMdl(); + for (int i = 0; i < mWindNodeID; ++i) { + pAnmObj->Bind(mdl, i, nw4r::g3d::AnmObjChr::BIND_ONE); + } + + if (requestedAnimation == RB_SET) { + pAnmObj->Bind(mdl, mLeftWingNodeID, nw4r::g3d::AnmObjChr::BIND_ONE); + pAnmObj->Bind(mdl, mRightWingNodeID, nw4r::g3d::AnmObjChr::BIND_ONE); + } + + mCurrentAnimation = requestedAnimation; + + mMdl.setAnm(mAnmChrBlend, sChrAnims[requestedAnimation].mRate); +} diff --git a/src/d/a/obj/d_a_obj_switch.cpp b/src/d/a/obj/d_a_obj_switch.cpp index ffc58d74..fd5cd444 100644 --- a/src/d/a/obj/d_a_obj_switch.cpp +++ b/src/d/a/obj/d_a_obj_switch.cpp @@ -3,6 +3,7 @@ #include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s.h" #include "d/col/bg/d_bg_w.h" +#include "d/d_linkage.h" #include "d/flag/sceneflag_manager.h" #include "nw4r/g3d/res/g3d_resfile.h" #include "s/s_Math.h" @@ -42,26 +43,29 @@ void dAcOsw_c::rideCallback(dBgW *unknown, dAcObjBase_c *actor, dAcObjBase_c *in dAcPy_c *link = interactor->isActorPlayer() ? static_cast(interactor) : nullptr; dAcOsw_c *sw = static_cast(actor); - // halp - if (!(link == nullptr || (!link->checkActionFlags(dAcPy_c::FLG0_IN_WATER) && - ((!link->checkFlags0x340(0x800000) || - ((link->getCurrentCarriedActor() != nullptr && - link->getCurrentCarriedActor()->mActorCarryInfo.testCarryFlag(0x04)))))))) { + if (link != nullptr) { + if (link->checkActionFlags(dAcPy_c::FLG0_IN_WATER)) { + return; + } + if (link->checkFlags0x340(0x800000) && + !(link->getCurrentCarriedActor() && link->getCurrentCarriedActor()->GetLinkage().checkFlag(0x04))) { + return; + } + } + + if (interactor->GetLinkage().checkState(dLinkage_c::STATE_ACTIVE)) { return; } - if (interactor->mActorCarryInfo.isCarried != 1) { - if (link == nullptr || (link->checkActionFlags(0xC70852)) == 0) { - if (!sw->someInteractCheck(link != nullptr)) { - bool needsOnFlag = sw->mOnSceneFlag < 0xFF && - !SceneflagManager::sInstance->checkBoolFlag(sw->roomid, sw->mOnSceneFlag); - if (!needsOnFlag && sw->mObjRef.get() == nullptr && link != nullptr && sw->field_0x5F1 == 0 && - sw->mStateMgr.isState(StateID_On)) { - link->onFlags_0x360(0x8000); - } + + if (!(link && link->checkActionFlags(0xC70852))) { + if (!sw->someInteractCheck(link != nullptr)) { + if (!sw->checkOnFlag() && sw->mObjRef.get() == nullptr && link != nullptr && sw->field_0x5F1 == 0 && + sw->mStateMgr.isState(StateID_On)) { + link->onFlags_0x360(0x8000); } } - interactor->setObjectProperty(0x40); } + interactor->setObjectProperty(0x40); } bool dAcOsw_c::createHeap() { diff --git a/src/d/d_carry.cpp b/src/d/d_carry.cpp deleted file mode 100644 index ce473dd4..00000000 --- a/src/d/d_carry.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "d/a/obj/d_a_obj_base.h" -#include "m/m_mtx.h" - -ActorCarryStruct::ActorCarryStruct() - : actorLink(nullptr), carriedActor(nullptr), carryFlags(0), carryType(0), field_0x18(0), - field_0x1C(0.0f, 0.0f, 0.0f), carryTransMtx(mMtx_c::Identity), field_0x58(mMtx_c::Identity), isCarried(0), - field_0x8C(0.0f), field_0x90(0.0f), field_0x94(0.0f), field_0x98(0.0f) {} - -ActorCarryStruct::~ActorCarryStruct() { - fn_80051190(nullptr); - fn_80050EB0(nullptr); -} diff --git a/src/d/d_linkage.cpp b/src/d/d_linkage.cpp new file mode 100644 index 00000000..c37f6118 --- /dev/null +++ b/src/d/d_linkage.cpp @@ -0,0 +1,251 @@ +#include "d/d_linkage.h" + +#include "common.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_acch.h" +#include "f/f_profile_name.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "rvl/MTX/mtx.h" + +dLinkage_c::dLinkage_c() + : mControllingActor(nullptr), + pLinkedActor(nullptr), + carryFlags(0), + mType(CONNECTION_0), + field_0x18(0), + field_0x1C(0.0f), + field_0x20(0.f), + field_0x24(0.f), + carryTransMtx(mMtx_c::Identity), + field_0x58(mMtx_c::Identity), + mState(STATE_0), + field_0x8C(0.0f), + field_0x90(0.0f), + field_0x94(0.0f), + field_0x98(0.0f) {} + +dLinkage_c::~dLinkage_c() { + fn_80051190(nullptr); + fn_80050EB0(nullptr); +} + +// Ignore the parameter names. I am unsure what they are +void dLinkage_c::set(u32 flags, f32 x, f32 y, f32 z, void *) { + onFlag(0x8000000 | flags); + field_0x1C = x; + field_0x20 = y; + field_0x24 = z; + + if (flags & 2) { + field_0x8C = 28.f; + field_0x90 = 36.f; + field_0x94 = 28.f; + field_0x98 = 0.f; + } else if (flags & 4) { + field_0x8C = 18.f; + field_0x90 = 25.f; + field_0x94 = 18.f; + field_0x98 = 0.f; + } else if (flags & 8) { + field_0x8C = 16.7f; + field_0x90 = 25.f; + field_0x94 = 16.7f; + field_0x98 = 0.f; + } else { + field_0x8C = 18.f; + field_0x90 = 30.f; + field_0x94 = 18.f; + field_0x98 = 0.f; + } +} + +bool dLinkage_c::tryAttach( + dAcObjBase_c *pActor, dAcObjBase_c *pSrc, dAcRefBase_c *pRef, dLinkage_c::ConnectionType_e type, bool replace +) { + if (checkState(STATE_ACTIVE)) { + if (replace) { + fn_80050EB0(pActor); + } else { + return false; + } + } + pActor->clearObjectProperty(0x1000); + pActor->clearObjectProperty(0x4); + mControllingActor.link(pSrc); + mState = STATE_ACTIVE; + mType = type; + + if (type == CONNECTION_4) { + pActor->setObjectProperty(0x4); + } else if (type == CONNECTION_7) { + pActor->setObjectProperty(0x1000); + field_0x1A = 4; + } + MTXIdentity(carryTransMtx); + pLinkedActor = pRef; + pRef->link(pActor); + if ((pSrc == dAcPy_c::GetLink2() || type == CONNECTION_5) && + pActor->getConnectParent()->profile_name == fProfile::ROOM) { + pActor->addActorToRoom(-1); + onFlag(0x20000000); + pActor->setActorProperty(0x2000000); + pActor->changeLoadedEntitiesWithSet(); + } + pActor->clearActorProperty(0x1); + return true; +} + +void dLinkage_c::fn_80050DC0(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) { + mState = STATE_2; + fn_80050E40(pActor, speed, velocityY, rot); +} + +void dLinkage_c::fn_80050E00(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) { + mState = STATE_3; + fn_80050E40(pActor, speed, velocityY, rot); +} + +void dLinkage_c::fn_80050E40(dAcObjBase_c *pActor, const f32 speed, const f32 velocityY, mAng rot) { + fn_80050EB0(pActor); + pActor->forwardSpeed = speed; + pActor->velocity.y = velocityY; + pActor->angle.y = rot; +} + +void dLinkage_c::fn_80050EA0(dAcObjBase_c *pActor) { + mState = STATE_DELETE; + fn_80050EB0(pActor); +} + +void dLinkage_c::fn_80050EB0(dAcObjBase_c *pActor) { + mControllingActor.unlink(); + if (pLinkedActor) { + pLinkedActor->unlink(); + pLinkedActor = nullptr; + } + + if (checkType_1_3_5_6_9()) { + MTXConcat(carryTransMtx, field_0x58, field_0x58); + field_0x58.fn_802F1C40(2, 0); + field_0x18 = 5; + MTXIdentity(carryTransMtx); + } else if (mType == CONNECTION_4) { + if (pActor) { + pActor->clearObjectProperty(0x4); + } + } else if (mType == CONNECTION_7) { + if (pActor) { + pActor->clearObjectProperty(0x1000); + } + } + + if (pActor && checkFlag(0x20000000)) { + pActor->addActorToRoom(pActor->getRoomId()); + offFlag(0x20000000); + } + + field_0x1A = 4; + mType = CONNECTION_0; + offFlag(0x10000000); +} + +void dLinkage_c::bushTpFunc(dBgS_Acch &acch) { + mVec3_c *pos = acch.GetPos(); + mVec3_c origPos = *pos; + + if (field_0x1A != 0) { + if (field_0x1A == 4 && !acch.ChkLineCheck()) { + acch.OnLineCheck(); + onFlag(0x4000000); + } + + if (--field_0x1A == 0 && checkFlag(0x4000000)) { + acch.OffLineCheck(); + offFlag(0x4000000); + } + } + + acch.CrrPos(*dBgS::GetInstance()); + if (mState == STATE_ACTIVE) { + dAcPy_c *player = dAcPy_c::GetLink2(); + if (mType == CONNECTION_1 && mControllingActor.p_owner == player) { + player->fn_80202E00(nullptr, pos->x - origPos.x, pos->z - origPos.z); + } + + if (mType == CONNECTION_7 && mControllingActor.p_owner == player) { + if (!checkFlag(0x10000)) { + if (acch.ChkWallHit(nullptr)) { + fn_80050EA0(player->getWhippedItem()); + return; + } + field_0x1A = 3; + } + } + + *pos = origPos; + } +} + +void dLinkage_c::fn_80051190(dAcObjBase_c *pActor) { + // If not active, return + if (!checkState(STATE_ACTIVE)) { + return; + } + + // If currently Linked + if (mControllingActor.p_owner) { + // if the actor being linked to is empty, no need to delink + if (pLinkedActor == nullptr) { + return; + } + + // If the Actor is linked to itself, return? + dAcObjBase_c *pLinked = static_cast(pLinkedActor->p_owner); + if (pLinked && &pLinked->GetLinkage() == this) { + return; + } + } + pLinkedActor = nullptr; + + fn_80050EA0(pActor); +} + +void dLinkage_c::fn_800511E0(dAcObjBase_c *pActor) { + bool b = checkType_1_3_5_6_9(); + + if (!(checkFlag(0x200) || b || field_0x18 == 0)) { + field_0x58.slerpTo(mMtx_c::Identity, field_0x58, 1.f / field_0x18); + field_0x58.fn_802F1C40(2, 0); + field_0x18--; + } + mMtx_c &mtx = pActor->mWorldMtx; + f32 y = field_0x1C * pActor->mScale.y; + mtx.transS(pActor->GetPosition().x, pActor->GetPosition().y + pActor->GetYOffset(), pActor->GetPosition().z); + if (mType == CONNECTION_1) { + MTXConcat(mtx, carryTransMtx, mtx); + } + mMtx_c m1; + MTXTrans(m1, 0.f, y, 0.f); + MTXConcat(mtx, m1, mtx); + + if (b && mType != CONNECTION_1) { + MTXConcat(mtx, carryTransMtx, mtx); + } + mMtx_c m2; + MTXConcat(mtx, field_0x58, mtx); + MTXTrans(m2, 0.f, -y, 0.f); + MTXConcat(mtx, m2, mtx); + + mtx.ZXYrotM(pActor->rotation); + if (mControllingActor.p_owner) { + pActor->roomid = static_cast(mControllingActor.p_owner)->roomid; + } +} + +bool dLinkage_c::fn_800513C0() const { + return (mState == STATE_ACTIVE && (mType == CONNECTION_1 || mType == CONNECTION_6)) && + !(mControllingActor.p_owner && mControllingActor.p_owner->profile_name == fProfile::E_GEROCK); +} diff --git a/src/m/m_mtx.cpp b/src/m/m_mtx.cpp index 712d612c..521cbb7a 100644 --- a/src/m/m_mtx.cpp +++ b/src/m/m_mtx.cpp @@ -1,6 +1,8 @@ +#include "m/m_mtx.h" + #include "c/c_math.h" #include "m/m_math.h" -#include "nw4r/math.h" +#include "m/m_vec.h" void mMtx_c::toRot(mAng3_c &out) const { f32 t1 = 0.0f; @@ -10,3 +12,47 @@ void mMtx_c::toRot(mAng3_c &out) const { } s16 anglex = cM::atan2s(-m[1][2], t1); } + +void mMtx_c::fn_802F1C40(s32 i, s32 j) { + f32 *pJ = &arr[j]; + f32 *pI = &arr[i]; + + mVec3_c v0(pI[0], pI[4], pI[8]); + mVec3_c v1(pJ[0], pJ[4], pJ[8]); + + mVec3_c v2; + v0.normalize(); + + f32 z, y, x; + if (j - i == 1 || j - i == -2) { + z = (v0.x * v1.y) - (v0.y * v1.x); + y = (v0.z * v1.x) - (v0.x * v1.z); + x = (v0.y * v1.z) - (v0.z * v1.y); + v2 = mVec3_c(x, y, z); + + z = (v2.x * v0.y) - (v2.y * v0.x); + y = (v2.z * v0.x) - (v2.x * v0.z); + x = (v2.y * v0.z) - (v2.z * v0.y); + v1 = mVec3_c(x, y, z); + } else { + z = (v1.x * v0.y) - (v1.y * v0.x); + y = (v1.z * v0.x) - (v1.x * v0.z); + x = (v1.y * v0.z) - (v1.z * v0.y); + v2 = mVec3_c(x, y, z); + + z = (v0.x * v2.y) - (v0.y * v2.x); + y = (v0.z * v2.x) - (v0.x * v2.z); + x = (v0.y * v2.z) - (v0.z * v2.y); + v1 = mVec3_c(x, y, z); + } + v2.normalize(); + v1.normalize(); + + f32 *pK = &arr[((3 - i) - j)]; + + // clang-format off + pI[0] = v0.x; pI[4] = v0.y; pI[8] = v0.z; + pJ[0] = v1.x; pJ[4] = v1.y; pJ[8] = v1.z; + pK[0] = v2.x; pK[4] = v2.y; pK[8] = v2.z; + // clang-format on +}