diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d36c353e..5111fa04 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2125,7 +2125,7 @@ fn_80051E40 = .text:0x80051E40; // type:function size:0x64 ColliderManager__staticAddCollider = .text:0x80051EB0; // type:function size:0x34 ColliderLinkedList__registerColliders = .text:0x80051EF0; // type:function size:0x10 fn_80051F00 = .text:0x80051F00; // type:function size:0x8 -setMtx__16TboxAndMoreUnkCCFRC6mMtx_c = .text:0x80051F10; // type:function size:0x10 +SetStts__16TboxAndMoreUnkCCFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 ColliderLinkedList__search = .text:0x80051F20; // type:function size:0x74 fn_80051FA0 = .text:0x80051FA0; // type:function size:0x1C fn_80051FC0 = .text:0x80051FC0; // type:function size:0x10 @@ -2451,7 +2451,7 @@ isSpinAttackingHorizontally = .text:0x8005B830; // type:function size:0x20 isSpinAttackingVertically = .text:0x8005B850; // type:function size:0x20 fn_8005B870 = .text:0x8005B870; // type:function size:0x28 fn_8005B8A0 = .text:0x8005B8A0; // type:function size:0xC0 -ActorLink__setPosYRot = .text:0x8005B960; // type:function size:0x44 +setPosYRot__7dAcPy_cFRC7mVec3_c4mAngiii = .text:0x8005B960; // type:function size:0x44 setTransform__7dAcPy_cFRC6mMtx_ciii = .text:0x8005B9B0; // type:function size:0x98 fn_8005BA50 = .text:0x8005BA50; // type:function size:0x30 fn_8005BA80 = .text:0x8005BA80; // type:function size:0x8 @@ -14241,7 +14241,7 @@ fn_802685D0 = .text:0x802685D0; // type:function size:0x68 fn_80268640 = .text:0x80268640; // type:function size:0x4 fn_80268650 = .text:0x80268650; // type:function size:0x8 fn_80268660__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 -hasCollectedAllTears2 = .text:0x80268680; // type:function size:0x1C +hasCollectedAllTears__9dAcTbox_cFv = .text:0x80268680; // type:function size:0x1C fn_802686A0 = .text:0x802686A0; // type:function size:0x50 fn_802686F0 = .text:0x802686F0; // type:function size:0x5C __ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC @@ -14253,24 +14253,24 @@ __dt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c>Fv = .text:0x80268C50; // __dt__9dAcTbox_cFv = .text:0x80268D00; // type:function size:0x250 createHeap__9dAcTbox_cFv = .text:0x80268F50; // type:function size:0x54C create__9dAcTbox_cFv = .text:0x802694A0; // type:function size:0xA00 -AcTbox__destroy = .text:0x80269EA0; // type:function size:0xB4 -AcTbox__update = .text:0x80269F60; // type:function size:0x690 +doDelete__9dAcTbox_cFv = .text:0x80269EA0; // type:function size:0xB4 +actorExecute__9dAcTbox_cFv = .text:0x80269F60; // type:function size:0x690 getStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026A5F0; // type:function size:0x10 executeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026A600; // type:function size:0x10 -AcTbox__updateInEvent = .text:0x8026A610; // type:function size:0x8F0 +actorExecuteInEvent__9dAcTbox_cFv = .text:0x8026A610; // type:function size:0x8F0 changeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8026AF00; // type:function size:0x10 -AcTbox__draw = .text:0x8026AF10; // type:function size:0x1AC -AcTbox__setActionState = .text:0x8026B0C0; // type:function size:0x224 -AcTbox__isValidSubtype = .text:0x8026B2F0; // type:function size:0x20 -fn_8026B310 = .text:0x8026B310; // type:function size:0x8 -fn_8026B320 = .text:0x8026B320; // type:function size:0x8 -setItemId__9dAcTbox_cCFUs = .text:0x8026B330; // type:function size:0x8 +draw__9dAcTbox_cFv = .text:0x8026AF10; // type:function size:0x1AC +setActionState__9dAcTbox_cFv = .text:0x8026B0C0; // type:function size:0x224 +isValidVariant__9dAcTbox_cFi = .text:0x8026B2F0; // type:function size:0x20 +getObjectListEntry__9dAcTbox_cFv = .text:0x8026B310; // type:function size:0x8 +setFlags__9dAcTbox_cFUl = .text:0x8026B320; // type:function size:0x8 +setItemId__9dAcTbox_cFUs = .text:0x8026B330; // type:function size:0x8 setDoObstructionCheck__9dAcTbox_cFv = .text:0x8026B340; // type:function size:0xC isActualVisibleBox__9dAcTbox_cCFv = .text:0x8026B350; // type:function size:0xC noObstructionCheck__9dAcTbox_cCFv = .text:0x8026B360; // type:function size:0xC fn_8026B370__9dAcTbox_cCFv = .text:0x8026B370; // type:function size:0xC -fn_8026B380 = .text:0x8026B380; // type:function size:0x3C -fn_8026B3C0 = .text:0x8026B3C0; // type:function size:0x20 +fn_8026B380__9dAcTbox_cCFR7mVec3_c = .text:0x8026B380; // type:function size:0x3C +fn_8026B3C0__9dAcTbox_cCFv = .text:0x8026B3C0; // type:function size:0x20 initializeState_DugOut__9dAcTbox_cFv = .text:0x8026B3E0; // type:function size:0x11C executeState_DugOut__9dAcTbox_cFv = .text:0x8026B500; // type:function size:0x3D8 finalizeState_DugOut__9dAcTbox_cFv = .text:0x8026B8E0; // type:function size:0x4 @@ -14321,17 +14321,17 @@ AcTbox__checkShouldClose = .text:0x8026D340; // type:function size:0xC AcTbox__setShouldCloseFlag = .text:0x8026D350; // type:function size:0xC AcTbox__unsetShouldCloseFlag = .text:0x8026D360; // type:function size:0xC fn_8026D370 = .text:0x8026D370; // type:function size:0x4C -fn_8026D3C0 = .text:0x8026D3C0; // type:function size:0xD4 +fn_8026D3C0__9dAcTbox_cFv = .text:0x8026D3C0; // type:function size:0xD4 setChestFlag__9dAcTbox_cFv = .text:0x8026D4A0; // type:function size:0x10 AcTbox__setTboxFlag = .text:0x8026D4B0; // type:function size:0x18 checkTboxFlag__9dAcTbox_cCFv = .text:0x8026D4D0; // type:function size:0x4C -fn_8026D520 = .text:0x8026D520; // type:function size:0x18 -fn_8026D540 = .text:0x8026D540; // type:function size:0x14 +isNotSmall__9dAcTbox_cCFv = .text:0x8026D520; // type:function size:0x18 +fn_8026D540__9dAcTbox_cFv = .text:0x8026D540; // type:function size:0x14 fn_8026D560__9dAcTbox_cCFv = .text:0x8026D560; // type:function size:0x94 getSomeCounter__9dAcTbox_cCFPUl = .text:0x8026D600; // type:function size:0x68 fn_8026D670__9dAcTbox_cCFv = .text:0x8026D670; // type:function size:0x8 -fn_8026D680 = .text:0x8026D680; // type:function size:0x10 -ActorObjectBase__setActorCollision = .text:0x8026D690; // type:function size:0xB8 +syncScaleToMdl__9dAcTbox_cFPQ23m3d9scnLeaf_c = .text:0x8026D680; // type:function size:0x10 +initBgW__9dAcTbox_cFR4dBgWPCcPCc = .text:0x8026D690; // type:function size:0xB8 AcTbox__initializeDowsingTarget = .text:0x8026D750; // type:function size:0x14 isItemRupee__9dAcTbox_cCFv = .text:0x8026D770; // type:function size:0x8 initDowsingTarget__9dAcTbox_cFQ213DowsingTarget11DowsingSlot = .text:0x8026D780; // type:function size:0x50 @@ -14343,13 +14343,13 @@ noUnregisterDowsing = .text:0x8026D8F0; // type:function size:0x4 unregisterDowsing = .text:0x8026D900; // type:function size:0x48 fn_8026D950 = .text:0x8026D950; // type:function size:0x28 checkIsClear = .text:0x8026D980; // type:function size:0x140 -fn_8026DAC0 = .text:0x8026DAC0; // type:function size:0x10 -fn_8026DAD0 = .text:0x8026DAD0; // type:function size:0x8 -fn_8026DAE0 = .text:0x8026DAE0; // type:function size:0x28C -fn_8026DD70 = .text:0x8026DD70; // type:function size:0x2DC -AcTbox__getInteractionTargetDef = .text:0x8026E050; // type:function size:0x40 -fn_8026E090 = .text:0x8026E090; // type:function size:0x594 -fn_8026E630 = .text:0x8026E630; // type:function size:0x10C +fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 +fn_8026DAD0__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 +getCylParams__9dAcTbox_cFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C +fn_8026DD70__9dAcTbox_cFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC +getInteractionTargetDef__9dAcTbox_cCFv = .text:0x8026E050; // type:function size:0x40 +fn_8026E090__9dAcTbox_cFv = .text:0x8026E090; // type:function size:0x594 +fn_8026E630__9dAcTbox_cFv = .text:0x8026E630; // type:function size:0x10C build__24sFStateFct_c<9dAcTbox_c>FRC12sStateIDIf_c = .text:0x8026E740; // type:function size:0x60 dispose__24sFStateFct_c<9dAcTbox_c>FRP10sStateIf_c = .text:0x8026E7A0; // type:function size:0xC initialize__21sFState_c<9dAcTbox_c>Fv = .text:0x8026E7B0; // type:function size:0x1C @@ -40233,7 +40233,7 @@ lbl_805758F8 = .sbss:0x805758F8; // type:object size:0x8 data:byte lbl_80575900 = .sbss:0x80575900; // type:object size:0x8 data:byte @GUARD@draw__13dAcObjFairy_cFv@rot = .sbss:0x80575908; // type:object size:0x8 data:byte sTboxActorList__9dAcTbox_c = .sbss:0x80575910; // type:object size:0x8 data:4byte -CURRENT_OBTAINING_ITEM_OARC_NAME = .sbss:0x80575918; // type:object size:0x4 data:4byte +sCurrentObtainingItemOarcName = .sbss:0x80575918; // type:object size:0x4 data:4byte @GUARD@create__9dAcTbox_cFv@s1 = .sbss:0x8057591C; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@s2@0 = .sbss:0x8057591D; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@bbLo@3 = .sbss:0x8057591E; // type:object size:0x1 data:byte diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index a82fb862..139a511a 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -50,6 +50,7 @@ public: virtual ~dAcPy_c(); void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD); + void setPosYRot(const mVec3_c &pos, mAng rot, UNKWORD, UNKWORD, UNKWORD); /* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD); /* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD); diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 659fba39..9e86f68e 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -13,11 +13,13 @@ #include "m/m3d/m_anmmdl.h" #include "m/m3d/m_anmtexpat.h" #include "m/m3d/m_anmtexsrt.h" +#include "m/m3d/m_scnleaf.h" #include "m/m3d/m_smdl.h" #include "m/m_vec.h" #include "nw4r/ut/ut_Color.h" #include "s/s_State.hpp" #include "toBeSorted/actor_event.h" +#include "toBeSorted/attention.h" #include "toBeSorted/dowsing_target.h" #include "toBeSorted/stage_render_stuff.h" @@ -42,6 +44,7 @@ struct TboxAndMoreUnkCC { void addCc(dAcTboxCcD &ccD, const dCcD_SrcUnk &src); void SetStts(cCcD_Stts &stts); + void registerColliders(); }; class dAcTbox_c : public dAcObjBase_c { @@ -63,6 +66,8 @@ public: virtual int actorExecuteInEvent() override; virtual int draw() override; + virtual void *getObjectListEntry() override; + STATE_FUNC_DECLARE(dAcTbox_c, DugOut); STATE_FUNC_DECLARE(dAcTbox_c, WaitAppear); STATE_FUNC_DECLARE(dAcTbox_c, DemoAppear); @@ -80,7 +85,7 @@ public: private: bool initBgW(dBgW &bg, const char *arcName, const char *ccName); bool isNotSmall() const; - void setItemId(u16 item) const; + void setItemId(u16 item); void setChestFlag(); void setDoObstructionCheck(); int isActualVisibleBox() const; @@ -104,6 +109,26 @@ private: void noUnregisterDowsing(); static bool fn_80268660(int arg); + void fn_8026E090(); + void fn_8026E630(); + bool fn_8026D540(); + bool fn_8026D3C0(); + void syncScaleToMdl(m3d::scnLeaf_c *lf); + void fn_8026DD70(mVec3_c *out1, mVec3_c *out2); + void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3); + void fn_8026DAD0(mVec3_c *src, mVec3_c *dest) const; + void fn_8026DAC0(mAng& ang); + + static bool hasCollectedAllTears(); + static bool isValidVariant(int variant); + + void setActionState(); + + void setFlags(u32 flags); + + void fn_8026D140(); + + const InteractionTargetDef &getInteractionTargetDef() const; /* 0x0330 */ m3d::mdlAnmChr mMdl1; /* 0x0398 */ m3d::smdl_c mOpenFxMdl; @@ -142,18 +167,20 @@ private: /* 0x11D8 */ mVec3_c field_0x11D8; - /* 0x11E4 */ u8 field_0x11E4[0x11EC - 0x11E4]; + /* 0x11E4 */ u8 field_0x11E4[0x11E8 - 0x11E4]; + /* 0x11E8 */ f32 field_0x11E8; /* 0x11EC */ f32 field_0x11EC; /* 0x11F0 */ UNKWORD field_0x11F0; + /* 0x11F4 */ UNKWORD field_0x11F4; - /* 0x11F4 */ u8 field_0x11F4[0x11FC - 0x11F4]; + /* 0x11F8 */ u8 field_0x11F8[0x11FC - 0x11F8]; /* 0x11FC */ UNKWORD field_0x11FC; /* 0x1200 */ u16 mItemId; - /* 0x1202 */ u8 field_0x1202[0x1204 - 0x1202]; + /* 0x1202 */ u16 mItemModelIdx; /* 0x1204 */ bool mHasBeenOpened; /* 0x1205 */ u8 mSpawnSceneFlag; @@ -165,7 +192,8 @@ private: /* 0x1209 */ u8 mVariant; /* 0x120A */ u8 field_0x120A; - /* 0x120B */ u8 field_0x120B[0x120D - 0x120B]; + /* 0x120B */ u8 field_0x120B; + /* 0x120C */ u8 field_0x120C; /* 0x120D */ u8 field_0x120D; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 49791e31..44f43d3b 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -889,6 +889,9 @@ public: void OnTgSet() { mTg.OnSPrm(1); } + void OffTgSet() { + mTg.OffSPrm(1); + } u32 GetTgGrp() const { return mTg.MskSPrm(0x3E); } diff --git a/include/d/col/cc/d_cc_d.h b/include/d/col/cc/d_cc_d.h index 2242323e..3c5bc793 100644 --- a/include/d/col/cc/d_cc_d.h +++ b/include/d/col/cc/d_cc_d.h @@ -83,6 +83,9 @@ public: virtual cCcD_ShapeAttr *GetShapeAttr() override; + // Have to bring these in scope. Consider renaming this + // Set function instead or create an inline? + using cM3dGUnk::Set; void Set(const dCcD_SrcUnk &src); }; diff --git a/include/toBeSorted/arc_managers/oarc_manager.h b/include/toBeSorted/arc_managers/oarc_manager.h index aee63e1a..7bbe22d5 100644 --- a/include/toBeSorted/arc_managers/oarc_manager.h +++ b/include/toBeSorted/arc_managers/oarc_manager.h @@ -19,7 +19,7 @@ public: bool checkIfObjectArcExistsOnDisk(const char *object); bool loadObjectArcFromDisk(const char *object, EGG::Heap *heap); bool addEntryFromSuperArc(const char *object, void *data, EGG::Heap *heap); - void ensureLoaded1(const char *object); + int ensureLoaded1(const char *object); void ensureLoaded2(const char *object); bool decrement(const char *path); void *getData(const char *oarcName, const char *fileName); diff --git a/include/toBeSorted/room_manager.h b/include/toBeSorted/room_manager.h index 04f5d491..fcc5688a 100644 --- a/include/toBeSorted/room_manager.h +++ b/include/toBeSorted/room_manager.h @@ -60,6 +60,10 @@ public: char _7[3]; bool hasAnmTexPat; bool didAlreadyInit; + + bool checkFlag(u32 flag) { + return flags & flag; + } }; class dRoomTable { diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 11dcd85b..702e8f92 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1,9 +1,12 @@ #include "d/a/obj/d_a_obj_tbox.h" +#include "c/c_lib.h" #include "common.h" #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" +#include "d/a/d_a_player.h" #include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "m/m3d/m_fanm.h" @@ -14,7 +17,11 @@ #include "nw4r/g3d/g3d_resanmtexsrt.h" #include "nw4r/g3d/g3d_resfile.h" #include "nw4r/g3d/g3d_resmdl.h" +#include "s/s_Math.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/attention.h" #include "toBeSorted/dowsing_target.h" +#include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); @@ -42,6 +49,7 @@ STATE_DEFINE(dAcTbox_c, Wait); STATE_DEFINE(dAcTbox_c, GoddessWait); fLiMgBa_c dAcTbox_c::sTboxActorList; +static const char *sCurrentObtainingItemOarcName = nullptr; static char *const sArcNames[] = { "TBoxNormalT", @@ -69,11 +77,634 @@ extern "C" char *const sOpenEventNames[] = { // TODO just copied from somewhere const cCcD_SrcGObj dAcTbox_c::sColSrc = { /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, - /* mObjCo */ {0x0} + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0, {0, 0x407}, 0, 0}, + /* mObjCo */ {0xE9} }; // clang-format on +static const char sGetTriForce[] = "GetTriForce"; +static const char sGetSwordA[] = "GetSwordA"; +static const char sGetHarp[] = "GetHarp"; +static const char sGetSirenFlower[] = "GetSirenFlower"; +static const char sGetBowA[] = "GetBowA"; +static const char sGetHookShot[] = "GetHookShot"; +static const char sGetBirdStatue[] = "GetBirdStatue"; +static const char sGetKeyBoss2A[] = "GetKeyBoss2A"; +static const char sGetKeyBoss2B[] = "GetKeyBoss2B"; +static const char sGetKeyBoss2C[] = "GetKeyBoss2C"; +static const char sGetKeyKakeraA[] = "GetKeyKakeraA"; +static const char sGetKeyBossA[] = "GetKeyBossA"; +static const char sGetKeyBossB[] = "GetKeyBossB"; +static const char sGetKeyBossC[] = "GetKeyBossC"; +static const char sGetGenki[] = "GetGenki"; +static const char sGetBottleKinokoA[] = "GetBottleKinokoA"; +static const char sGetBomb[] = "GetBomb"; +static const char sGetVacuum[] = "GetVacuum"; +static const char sGetMap[] = "GetMap"; +static const char sGetBeetleA[] = "GetBeetleA"; +static const char sGetBottleWater[] = "GetBottleWater"; +static const char sGetBottleKinokoB[] = "GetBottleKinokoB"; +static const char sGetMoleGloveA[] = "GetMoleGloveA"; +static const char sGetSeedSet[] = "GetSeedSet"; +static const char sGetBottleMuteki[] = "GetBottleMuteki"; +static const char sGetUroko[] = "GetUroko"; +static const char sGetMedal[] = "GetMedal"; +static const char sGetNetA[] = "GetNetA"; +static const char sGetFairy[] = "GetFairy"; +static const char sGetBottleHoly[] = "GetBottleHoly"; +static const char sGetBeetleB[] = "GetBeetleB"; +static const char sGetBeetleC[] = "GetBeetleC"; +static const char sGetBeetleD[] = "GetBeetleD"; +static const char sGetBottleKusuri[] = "GetBottleKusuri"; +static const char sGetBottleKusuriS[] = "GetBottleKusuriS"; +static const char sGetBottleGuts[] = "GetBottleGuts"; +static const char sGetBottleAir[] = "GetBottleAir"; +static const char sGetBottleFairy[] = "GetBottleFairy"; +static const char sGetBowB[] = "GetBowB"; +static const char sGetBowC[] = "GetBowC"; +static const char sGetBombBag[] = "GetBombBag"; +static const char sGetRupee[] = "GetRupee"; +static const char sGetMoleGloveB[] = "GetMoleGloveB"; +static const char sGetPachinkoB[] = "GetPachinkoB"; +static const char sGetPurseB[] = "GetPurseB"; +static const char sGetPurseC[] = "GetPurseC"; +static const char sGetPurseD[] = "GetPurseD"; +static const char sGetPurseE[] = "GetPurseE"; +static const char sGetPouchA[] = "GetPouchA"; +static const char sGetPouchB[] = "GetPouchB"; +static const char sGetShieldWood[] = "GetShieldWood"; +static const char sGetShieldIron[] = "GetShieldIron"; +static const char sGetShieldHoly[] = "GetShieldHoly"; +static const char sGetShieldHylia[] = "GetShieldHylia"; +static const char sGetBottleRepair[] = "GetBottleRepair"; +static const char sGetSpareSeedA[] = "GetSpareSeedA"; +static const char sGetSpareSeedB[] = "GetSpareSeedB"; +static const char sGetSpareSeedC[] = "GetSpareSeedC"; +static const char sGetSpareQuiverA[] = "GetSpareQuiverA"; +static const char sGetSpareQuiverB[] = "GetSpareQuiverB"; +static const char sGetSpareQuiverC[] = "GetSpareQuiverC"; +static const char sGetSpareBombBagA[] = "GetSpareBombBagA"; +static const char sGetSpareBombBagB[] = "GetSpareBombBagB"; +static const char sGetSpareBombBagC[] = "GetSpareBombBagC"; +static const char sGetWhip[] = "GetWhip"; +static const char sGetEarring[] = "GetEarring"; +static const char sGetNetB[] = "GetNetB"; +static const char sGetInsectGrasshopper[] = "GetInsectGrasshopper"; +static const char sGetInsectBeetle[] = "GetInsectBeetle"; +static const char sGetInsectBee[] = "GetInsectBee"; +static const char sGetInsectKamakiri[] = "GetInsectKamakiri"; +static const char sGetInsectLadybug[] = "GetInsectLadybug"; +static const char sGetInsectButterfly[] = "GetInsectButterfly"; +static const char sGetInsectAnt[] = "GetInsectAnt"; +static const char sGetInsectCicada[] = "GetInsectCicada"; +static const char sGetInsectDragonfly[] = "GetInsectDragonfly"; +static const char sGetInsectScarab[] = "GetInsectScarab"; +static const char sGetInsectKuwagata[] = "GetInsectKuwagata"; +static const char sGetInsectFirefly[] = "GetInsectFirefly"; +static const char sGetBottleEmpty[] = "GetBottleEmpty"; +static const char sGetKobunALetter[] = "GetKobunALetter"; +static const char sGetTerryCage[] = "GetTerryCage"; +static const char sGetSozaiA[] = "GetSozaiA"; +static const char sGetSozaiB[] = "GetSozaiB"; +static const char sGetSozaiC[] = "GetSozaiC"; +static const char sGetSozaiD[] = "GetSozaiD"; +static const char sGetSozaiE[] = "GetSozaiE"; +static const char sGetSozaiF[] = "GetSozaiF"; +static const char sGetSozaiG[] = "GetSozaiG"; +static const char sGetSozaiH[] = "GetSozaiH"; +static const char sGetSozaiI[] = "GetSozaiI"; +static const char sGetSozaiJ[] = "GetSozaiJ"; +static const char sGetSozaiL[] = "GetSozaiL"; +static const char sGetSozaiK[] = "GetSozaiK"; +static const char sGetSozaiM[] = "GetSozaiM"; +static const char sGetSozaiN[] = "GetSozaiN"; +static const char sGetSozaiO[] = "GetSozaiO"; +static const char sGetSozaiP[] = "GetSozaiP"; +static const char sGetSekibanMapA[] = "GetSekibanMapA"; +static const char sGetSekibanMapB[] = "GetSekibanMapB"; +static const char sGetSekibanMapC[] = "GetSekibanMapC"; +static const char sGetSirenKey[] = "GetSirenKey"; +static const char sGetBottleRepairS[] = "GetBottleRepairS"; +static const char sGetBottlePumpkin[] = "GetBottlePumpkin"; +static const char sGetSeedLife[] = "GetSeedLife"; +static const char sGetFruitB[] = "GetFruitB"; +static const char sGetSparePurse[] = "GetSparePurse"; + +static const char *const sItemToArchiveName[MAX_ITEM_ID + 1] = { + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetTriForce, + nullptr, + nullptr, + nullptr, + nullptr, + sGetSwordA, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetHarp, + sGetSirenFlower, + nullptr, + sGetBowA, + sGetHookShot, + sGetBirdStatue, + nullptr, + nullptr, + nullptr, + sGetKeyBoss2A, + sGetKeyBoss2B, + sGetKeyBoss2C, + sGetKeyKakeraA, + sGetKeyBossA, + sGetKeyBossB, + sGetKeyBossC, + nullptr, + nullptr, + nullptr, + sGetGenki, + sGetBottleKinokoA, + nullptr, + nullptr, + nullptr, + sGetBomb, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetGenki, + sGetVacuum, + sGetMap, + sGetMap, + nullptr, + sGetBeetleA, + sGetBottleWater, + sGetBottleKinokoB, + sGetMoleGloveA, + nullptr, + nullptr, + nullptr, + sGetSeedSet, + nullptr, + nullptr, + nullptr, + nullptr, + sGetBottleMuteki, + sGetBottleMuteki, + nullptr, + sGetUroko, + nullptr, + sGetMedal, + sGetNetA, + sGetFairy, + nullptr, + sGetBottleHoly, + sGetBeetleB, + sGetBeetleC, + sGetBeetleD, + sGetBottleKusuri, + sGetBottleKusuri, + nullptr, + sGetBottleKusuriS, + nullptr, + nullptr, + sGetBottleGuts, + sGetBottleGuts, + sGetBottleAir, + sGetBottleAir, + sGetBottleFairy, + nullptr, + sGetBowB, + sGetBowC, + sGetBombBag, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetRupee, + sGetMoleGloveB, + sGetMedal, + sGetMedal, + sGetMedal, + sGetMedal, + sGetMedal, + sGetPachinkoB, + nullptr, + nullptr, + sGetPurseB, + sGetPurseC, + sGetPurseD, + sGetPurseE, + sGetPouchA, + sGetPouchB, + sGetMedal, + nullptr, + sGetShieldWood, + sGetShieldWood, + sGetShieldWood, + sGetShieldIron, + sGetShieldIron, + sGetShieldIron, + sGetShieldHoly, + sGetShieldHoly, + sGetShieldHoly, + sGetShieldHylia, + sGetBottleRepair, + sGetBottleRepair, + sGetSpareSeedA, + sGetSpareSeedB, + sGetSpareSeedC, + sGetSpareQuiverA, + sGetSpareQuiverB, + sGetSpareQuiverC, + sGetSpareBombBagA, + sGetSpareBombBagB, + sGetSpareBombBagC, + sGetWhip, + sGetEarring, + nullptr, + sGetNetB, + sGetInsectGrasshopper, + sGetInsectBeetle, + sGetInsectBee, + sGetInsectKamakiri, + sGetInsectLadybug, + sGetInsectButterfly, + sGetInsectAnt, + sGetInsectCicada, + sGetInsectDragonfly, + sGetInsectScarab, + sGetInsectKuwagata, + sGetInsectFirefly, + sGetBottleEmpty, + nullptr, + nullptr, + nullptr, + nullptr, + sGetKobunALetter, + sGetTerryCage, + nullptr, + sGetSozaiA, + sGetSozaiB, + sGetSozaiC, + sGetSozaiD, + sGetSozaiE, + sGetSozaiF, + sGetSozaiG, + sGetSozaiH, + sGetSozaiI, + sGetSozaiJ, + sGetSozaiL, // not alphabetical + sGetSozaiK, // not alphabetical + sGetSozaiM, + sGetSozaiN, + sGetSozaiO, + sGetSozaiP, + sGetSekibanMapA, + sGetSekibanMapB, + sGetSekibanMapC, + sGetSirenKey, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetHarp, + sGetBottleRepairS, + sGetBottlePumpkin, + sGetBottlePumpkin, + sGetSeedLife, + sGetFruitB, + sGetSparePurse, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, +}; + // TODO enum, item comments static const u8 sItemToTBoxVariant[MAX_ITEM_ID + 1] = { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, @@ -123,6 +754,9 @@ static char *const sOpenCcNames[] = { dAcTbox_c::dAcTbox_c() : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), mDowsingTarget1(this, DowsingTarget::SLOT_NONE), mDowsingTarget2(this, DowsingTarget::SLOT_NONE) { + field_0x120B = 0; + field_0x120E = 0; + mDoObstructedCheck = false; sTboxActorList.append(&mTboxListNode); unkByteTargetFiRelated = 2; } @@ -382,7 +1016,7 @@ int dAcTbox_c::create() { // clang-format off static const dCcD_SrcUnk s3 = {{ /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {7, 0x407}, 0, 0}, /* mObjCo */ {0x0}}, {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; @@ -393,7 +1027,7 @@ int dAcTbox_c::create() { // clang-format off static const dCcD_SrcUnk s4 = {{ /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {6, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {6, 0x407}, 0, 0}, /* mObjCo */ {0x0}}, {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; @@ -456,17 +1090,494 @@ int dAcTbox_c::create() { field_0x4E8.b = 0; field_0x4EC = 0.0f; - field_0x4DC = position; - field_0x4DC.y += 100.0f; + field_0x4DC.x = position.x; + field_0x4DC.z = position.z; + field_0x4DC.y = position.y + 100.0f; return SUCCEEDED; } +int dAcTbox_c::doDelete() { + if (field_0x1210 != 0) { + sSomeCounters[field_0x1208]--; + field_0x1210 = 0; + } + if (sCurrentObtainingItemOarcName != nullptr) { + OarcManager *mng = OarcManager::sInstance; + if (!mng->ensureLoaded1(sCurrentObtainingItemOarcName)) { + mng->decrement(sCurrentObtainingItemOarcName); + sCurrentObtainingItemOarcName = nullptr; + } + } + + if (sCurrentObtainingItemOarcName == nullptr) { + changeLoadedEntitiesNoSet(); + return SUCCEEDED; + } + return NOT_READY; +} + +int dAcTbox_c::actorExecute() { + if (field_0x120D != 0) { + deleteRequest(); + return SUCCEEDED; + } + + setActionState(); + if (mStateMgr.isState(StateID_WaitOpen) || mStateMgr.isState(StateID_GoddessWaitOn)) { + (this->*mRegisterDowsingTarget)(); + } + + dRoom *r = RoomManager::m_Instance->GetRoomByIndex(roomid); + bool hasFlags = r->checkFlag(0x1E); + if (hasFlags) { + setObjectProperty(0x200); + } else { + clearObjectProperty(0x200); + } + + if (hasFlags) { + return SUCCEEDED; + } + + fn_8026E090(); + fn_8026E630(); + mStateMgr.executeState(); + if (fn_8026D540()) { + fn_8026D3C0(); + } + if (mVariant == GODDESS && mAnmGoddessPat.getFrame(0) == 1.0f) { + mAnmGoddessTexSrt.play(); + } + syncScaleToMdl(&mMdl1.getModel()); + mMdl1.getModel().calc(false); + if ((field_0x11F4 & 2) != 0) { + mVec3_c v1, v2; + fn_8026DD70(&v1, &v2); + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD3.Set(v1, v2); + mCcD3.Set(position, rotation.y); + mVec3_c cylC; + f32 width, height; + getCylParams(&cylC, &width, &height); + mCcD4.SetC(cylC); + mCcD4.SetR(width); + mCcD4.SetH(height); + dCcS::GetInstance()->Set(&mCcD4); + + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 100.0f, 42.0f); + break; + case 1: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 62.0f, 42.0f); + break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 35.0f); + break; + case 1: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 31.0f); + break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: + v1.set(-90.0f, 0.0f, -53.0f); + v2.set(90.0f, 133.0f, 56.0f); + break; + case 1: + v1.set(-80.0f, 0.0f, -53.0f); + v2.set(80.0f, 62.0f, 60.0f); + break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 100.0f, 47.0f); + break; + case 1: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 62.0f, 55.0f); + break; + } + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD1.Set(v1, v2); + mCcD1.Set(position, rotation.y); + if (field_0x120C == 1) { + mCcD2.OnTgSet(); + switch ((u32)mVariant) { + case NORMAL: + v1.set(-61.0f, 0.0f, -50.0f); + v2.set(61.0f, 80.0f, 0.0); + break; + case SMALL: + v1.set(-38.0f, -5.0f, -35.0f); + v2.set(38.0f, 65.0f, 0.0f); + break; + case BOSS: + v1.set(-90.0f, -10.0f, -85.0f); + v2.set(90.0f, 105.0f, 0.0f); + break; + case GODDESS: + v1.set(-62.0f, 0.0f, -57.0f); + v2.set(62.0f, 80.0f, 0.0f); + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD2.Set(v1, v2); + mCcD2.Set(field_0x11D8, rotation.y); + } else { + mCcD2.OffTgSet(); + } + field_0x0D48.registerColliders(); + } + + return SUCCEEDED; +} + +int dAcTbox_c::actorExecuteInEvent() { + if (field_0x120D != 0) { + deleteRequest(); + return SUCCEEDED; + } + + setActionState(); + if (mStateMgr.isState(StateID_WaitOpen) || mStateMgr.isState(StateID_GoddessWaitOn)) { + (this->*mRegisterDowsingTarget)(); + } + + dRoom *r = RoomManager::m_Instance->GetRoomByIndex(roomid); + bool hasFlags = r->checkFlag(0x1E); + if (hasFlags) { + setObjectProperty(0x200); + } else { + clearObjectProperty(0x200); + } + + if (hasFlags) { + return SUCCEEDED; + } + + fn_8026E090(); + fn_8026E630(); + + switch (mEvent.getCurrentEventCommand()) { + case 'wait': mEvent.advanceNext(); break; + case 'open': + if (mEvent.isAdvance()) { + if (mItemId == 0) { + mItemModelIdx = 0x10; + mStateMgr.changeState(StateID_DeleteArchive); + } else { + mStateMgr.changeState(StateID_Open); + } + } + mStateMgr.executeState(); + break; + case 'aper': + if (mEvent.isAdvance()) { + mStateMgr.changeState(StateID_DemoAppear); + } + mStateMgr.executeState(); + break; + case 'crct': { + mVec3_c v1; + mAng a1; + fn_8026DAD0(&v4, &v1); + fn_8026DAC0(a1); + dAcPy_c *link = dAcPy_c::LINK; + if (field_0x120B < 3) { + mVec3_c pos = link->position; + f32 f9 = cLib::addCalcPosXZ(&pos, v1, 0.25, 200.0f, 0.1f); + s16 rot2 = link->rotation.y; + s16 d = sLib::addCalcAngle(&rot2, a1, 2, 0x3FFF, 1); + if (f9 < 1.0f && labs(d) < 0xB6) { + link->setPosYRot(v1, a1, 0, 0, 0); + mEvent.advanceNext(); + } else { + link->setPosYRot(pos, rot2, 0, 0, 0); + } + } else { + link->setPosYRot(v1, a1, 0, 0, 0); + mEvent.advanceNext(); + } + + if (field_0x120B < 0xFF) { + field_0x120B++; + } + } break; + case '????': mStateMgr.executeState(); break; + default: mEvent.advanceNext(); break; + } + + // copied from actorExecute + if (fn_8026D540()) { + fn_8026D3C0(); + } + if (mVariant == GODDESS && mAnmGoddessPat.getFrame(0) == 1.0f) { + mAnmGoddessTexSrt.play(); + } + syncScaleToMdl(&mMdl1.getModel()); + mMdl1.getModel().calc(false); + if ((field_0x11F4 & 2) != 0) { + mVec3_c v1, v2; + fn_8026DD70(&v1, &v2); + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD3.Set(v1, v2); + mCcD3.Set(position, rotation.y); + mVec3_c cylC; + f32 width, height; + getCylParams(&cylC, &width, &height); + mCcD4.SetC(cylC); + mCcD4.SetR(width); + mCcD4.SetH(height); + dCcS::GetInstance()->Set(&mCcD4); + + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 100.0f, 42.0f); + break; + case 1: + v1.set(-61.0f, 0.0f, -42.0f); + v2.set(61.0f, 62.0f, 42.0f); + break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 35.0f); + break; + case 1: + v1.set(-38.0f, 0.0f, -35.0f); + v2.set(38.0f, 45.0f, 31.0f); + break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: + v1.set(-90.0f, 0.0f, -53.0f); + v2.set(90.0f, 133.0f, 56.0f); + break; + case 1: + v1.set(-80.0f, 0.0f, -53.0f); + v2.set(80.0f, 62.0f, 60.0f); + break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 100.0f, 47.0f); + break; + case 1: + v1.set(-62.0f, 0.0f, -47.0f); + v2.set(62.0f, 62.0f, 55.0f); + break; + } + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD1.Set(v1, v2); + mCcD1.Set(position, rotation.y); + if (field_0x120C == 1) { + mCcD2.OnTgSet(); + switch ((u32)mVariant) { + case NORMAL: + v1.set(-61.0f, 0.0f, -50.0f); + v2.set(61.0f, 80.0f, 0.0); + break; + case SMALL: + v1.set(-38.0f, -5.0f, -35.0f); + v2.set(38.0f, 65.0f, 0.0f); + break; + case BOSS: + v1.set(-90.0f, -10.0f, -85.0f); + v2.set(90.0f, 105.0f, 0.0f); + break; + case GODDESS: + v1.set(-62.0f, 0.0f, -57.0f); + v2.set(62.0f, 80.0f, 0.0f); + break; + } + v1 *= field_0x11E8; + v2 *= field_0x11E8; + mCcD2.Set(v1, v2); + mCcD2.Set(field_0x11D8, rotation.y); + } else { + mCcD2.OffTgSet(); + } + field_0x0D48.registerColliders(); + } + + return SUCCEEDED; +} + +int dAcTbox_c::draw() { + bool isInvisible = fabsf(mScale.x) <= FLT_EPSILON; + if (isInvisible) { + return SUCCEEDED; + } + + drawModelType1(&mMdl1.getModel()); + if (fn_8026D540()) { + drawModelType1(&mOpenFxMdl); + } + + static mQuat_c shadowDirs[4] = { + mQuat_c(0.0f, 45.0f, 0.0f, 100.0f), + mQuat_c(0.0f, 25.0f, 0.0f, 80.0f), + mQuat_c(0.0f, 55.0f, 0.0f, 120.0f), + mQuat_c(0.0f, 45.0f, 0.0f, 100.0f), + }; + + drawShadow(mShadowCircle, nullptr, mWorldMtx, &shadowDirs[mVariant], -1, -1, -1, -1, -1, 0.0f); + + return SUCCEEDED; +} + +void dAcTbox_c::setActionState() { + if (!field_0x120E) { + if (field_0x120F) { + mStateMgr.changeState(StateID_DugOut); + } else if (mHasBeenOpened == 1) { + if (mVariant == GODDESS) { + mStateMgr.changeState(StateID_GoddessWait); + } else { + mStateMgr.changeState(StateID_Wait); + } + } else if (mVariant == GODDESS) { + if (StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + mStateMgr.changeState(StateID_GoddessWaitOn); + } else { + mStateMgr.changeState(StateID_GoddessWaitOff); + } + } else if (mVariant == NORMAL) { + switch (field_0x120A) { + case 0: + if (hasCollectedAllTears()) { + mStateMgr.changeState(StateID_WaitOpen); + } else { + mStateMgr.changeState(StateID_WaitAppear); + } + break; + case 1: mStateMgr.changeState(StateID_WaitOpen); break; + case 3: + if (mSpawnSceneFlag >= 0xFF || + SceneflagManager::sInstance->checkBoolFlag(roomid, mSpawnSceneFlag)) { + mStateMgr.changeState(StateID_WaitOpen); + } else { + mStateMgr.changeState(StateID_WaitAppear); + } + break; + } + } else { + mStateMgr.changeState(StateID_WaitOpen); + } + field_0x120E = true; + } +} + +bool dAcTbox_c::isValidVariant(int variant) { + return 0 <= variant && variant <= 3; +} + +void *dAcTbox_c::getObjectListEntry() { + return &mTboxListNode; +} + +void dAcTbox_c::setFlags(u32 flags) { + field_0x11F4 = flags; +} + +void dAcTbox_c::setItemId(u16 itemId) { + mItemId = itemId; +} + +void dAcTbox_c::setDoObstructionCheck() { + mDoObstructedCheck = true; +} + +int dAcTbox_c::isActualVisibleBox() const { + return (params >> 0x1C); +} + +bool dAcTbox_c::noObstructionCheck() const { + return (rotation.x >> 9) & 1; +} + +int dAcTbox_c::fn_8026B370() const { + return (rotation.x >> 0xE) & 0x3; +} + +void dAcTbox_c::fn_8026B380(mVec3_c &out) const { + if (mVariant == BOSS) { + out.x = position.x; + out.y = position.y; + out.z = position.z; + } else { + fn_8026DAD0(&v1, &out); + } +} + +const mVec3_c &dAcTbox_c::fn_8026B3C0() const { + if (mVariant == BOSS) { + return v3; + } + return v2; +} + void dAcTbox_c::initializeState_DugOut() {} void dAcTbox_c::executeState_DugOut() {} void dAcTbox_c::finalizeState_DugOut() {} -void dAcTbox_c::initializeState_WaitAppear() {} -void dAcTbox_c::executeState_WaitAppear() {} +void dAcTbox_c::initializeState_WaitAppear() { + mScale.set(0.0f, 0.0f, 0.0f); + setActorProperty(0x100); + fn_8026D140(); + field_0x11E8 = 0.0f; + field_0x11F4 &= ~0x2; + field_0x120C = 0; + // field_0x11C0 +} +void dAcTbox_c::executeState_WaitAppear() { + // @bug doIt is uninitialized here, so WaitAppear is UB unless field_0x120A == 0 or field_0x120A == 3 + bool doIt; + switch (field_0x120A) { + case 0: doIt = hasCollectedAllTears(); break; + case 3: doIt = SceneflagManager::sInstance->checkBoolFlag(roomid, mSpawnSceneFlag); break; + } + + if (doIt) { + Event e("TboxShow", 100, 0x100001, nullptr, nullptr); + mEvent.scheduleEvent(e, 0); + } +} void dAcTbox_c::finalizeState_WaitAppear() {} void dAcTbox_c::initializeState_DemoAppear() { // TODO, just referencing this bit of data @@ -484,7 +1595,23 @@ void dAcTbox_c::initializeState_GoddessWaitOn() {} void dAcTbox_c::executeState_GoddessWaitOn() {} void dAcTbox_c::finalizeState_GoddessWaitOn() {} void dAcTbox_c::initializeState_DeleteArchive() {} -void dAcTbox_c::executeState_DeleteArchive() {} +void dAcTbox_c::executeState_DeleteArchive() { + if (sCurrentObtainingItemOarcName != nullptr) { + OarcManager *mng = OarcManager::sInstance; + if (!mng->ensureLoaded1(sCurrentObtainingItemOarcName)) { + mng->decrement(sCurrentObtainingItemOarcName); + sCurrentObtainingItemOarcName = nullptr; + } + } + + if (sCurrentObtainingItemOarcName == nullptr) { + if (sItemToArchiveName[mItemModelIdx] == nullptr) { + mStateMgr.changeState(StateID_Open); + } else { + mStateMgr.changeState(StateID_LoadArchive); + } + } +} void dAcTbox_c::finalizeState_DeleteArchive() {} void dAcTbox_c::initializeState_LoadArchive() {} void dAcTbox_c::executeState_LoadArchive() {} @@ -508,3 +1635,31 @@ void dAcTbox_c::finalizeState_GoddessWait() {} bool dAcTbox_c::isNotSmall() const { return mVariant != SMALL; } + +extern "C" const u32 DAT_804ee478[] = {0, 0, 1, 1}; + +const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { + switch ((u32)mVariant) { + case NORMAL: + default: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 200.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + case SMALL: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 160.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + case BOSS: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 200.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + case GODDESS: { + static const InteractionTargetDef tmpTarget = {0, 3, 1, OPEN, 0, 200.0f, + 60.0f, 60.0f, -100.0f, 100.0f, 0.0f, 1.0f}; + return tmpTarget; + } + } +} diff --git a/src/toBeSorted/arc_managers/oarc_manager.cpp b/src/toBeSorted/arc_managers/oarc_manager.cpp index 1faec959..1f858b41 100644 --- a/src/toBeSorted/arc_managers/oarc_manager.cpp +++ b/src/toBeSorted/arc_managers/oarc_manager.cpp @@ -35,8 +35,8 @@ bool OarcManager::addEntryFromSuperArc(const char *object, void *data, EGG::Heap return mArcTable.addEntryFromSuperArc(object, data, 0, heap); } -void OarcManager::ensureLoaded1(const char *object) { - mArcTable.ensureLoadedMaybe2(object); +int OarcManager::ensureLoaded1(const char *object) { + return mArcTable.ensureLoadedMaybe2(object); } void OarcManager::ensureLoaded2(const char *object) {