From 15d932d1eac1a32dfb053130710393fff6368c43 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 21 Nov 2024 21:22:50 +0100 Subject: [PATCH] progress --- config/SOUE01/symbols.txt | 32 +-- include/d/a/d_a_item.h | 1 + include/d/a/obj/d_a_obj_tbox.h | 25 +- include/d/col/c/c_cc_d.h | 3 - src/d/a/obj/d_a_obj_tbox.cpp | 423 +++++++++++++++++++++++++++++++-- 5 files changed, 438 insertions(+), 46 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4fef582e..4a925660 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13486,7 +13486,7 @@ AcItem__isSemiRareTreasure = .text:0x80250AE0; // type:function size:0x10 AcItem__isRareTreasure = .text:0x80250AF0; // type:function size:0x10 fn_80250B00 = .text:0x80250B00; // type:function size:0x10 fn_80250B10 = .text:0x80250B10; // type:function size:0x10 -AcItem__isRupee = .text:0x80250B20; // type:function size:0x88 +isRupee__9dAcItem_cF7ITEM_ID = .text:0x80250B20; // type:function size:0x88 AcItem__isBombDrop = .text:0x80250BB0; // type:function size:0x58 AcItem__isTear2 = .text:0x80250C10; // type:function size:0x78 AcItem__is_Larvae_Ore_JellyBlob_Claw_Horn_EvilCryst_OrnSkull_GoldSkull = .text:0x80250C90; // type:function size:0xB8 @@ -14243,7 +14243,7 @@ fn_80268650 = .text:0x80268650; // type:function size:0x8 fn_80268660__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 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 +fn_802686F0__9dAcTbox_cFRC7mVec3_cf = .text:0x802686F0; // type:function size:0x5C __ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC __dt__10dAcTboxCcDFv = .text:0x80268A40; // type:function size:0x98 __dt__21sFState_c<9dAcTbox_c>Fv = .text:0x80268AE0; // type:function size:0x58 @@ -14310,13 +14310,13 @@ finalizeState_Wait__9dAcTbox_cFv = .text:0x8026D000; // type:function size:0x4 initializeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D010; // type:function size:0x70 executeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D080; // type:function size:0x74 finalizeState_GoddessWait__9dAcTbox_cFv = .text:0x8026D100; // type:function size:0x4 -fn_8026D110 = .text:0x8026D110; // type:function size:0x8 +getDowsingTargetOffset__9dAcTbox_cCFP7mVec3_c = .text:0x8026D110; // type:function size:0x8 fn_8026D120 = .text:0x8026D120; // type:function size:0x8 fn_8026D130 = .text:0x8026D130; // type:function size:0x10 -fn_8026D140 = .text:0x8026D140; // type:function size:0x10 +fn_8026D140__9dAcTbox_cFv = .text:0x8026D140; // type:function size:0x10 AcTbox__doInteraction = .text:0x8026D150; // type:function size:0x98 -fn_8026D1F0 = .text:0x8026D1F0; // type:function size:0xDC -fn_8026D2D0 = .text:0x8026D2D0; // type:function size:0x68 +registerInEvent__9dAcTbox_cFv = .text:0x8026D1F0; // type:function size:0xDC +unkVirtFunc_0x6C__9dAcTbox_cFv = .text:0x8026D2D0; // type:function size:0x68 AcTbox__checkShouldClose = .text:0x8026D340; // type:function size:0xC AcTbox__setShouldCloseFlag = .text:0x8026D350; // type:function size:0xC AcTbox__unsetShouldCloseFlag = .text:0x8026D360; // type:function size:0xC @@ -14332,17 +14332,17 @@ getSomeCounter__9dAcTbox_cCFPUl = .text:0x8026D600; // type:function size:0x68 fn_8026D670__9dAcTbox_cCFv = .text:0x8026D670; // type:function size:0x8 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 +initDowsingTarget__9dAcTbox_cFP13DowsingTargetQ213DowsingTarget11DowsingSlotP7mVec3_c = .text:0x8026D750; // type:function size:0x14 isItemRupee__9dAcTbox_cCFv = .text:0x8026D770; // type:function size:0x8 initDowsingTarget__9dAcTbox_cFQ213DowsingTarget11DowsingSlot = .text:0x8026D780; // type:function size:0x50 initDowsingTargetCube__9dAcTbox_cFv = .text:0x8026D7D0; // type:function size:0x44 -noRegisterDowsing = .text:0x8026D820; // type:function size:0x4 -registersKeyPieceDowsing = .text:0x8026D830; // type:function size:0x68 -registerRupeeOrTreasureDowsing = .text:0x8026D8A0; // type:function size:0x48 -noUnregisterDowsing = .text:0x8026D8F0; // type:function size:0x4 -unregisterDowsing = .text:0x8026D900; // type:function size:0x48 +noRegisterDowsing__9dAcTbox_cFv = .text:0x8026D820; // type:function size:0x4 +registerKeyPieceDowsing__9dAcTbox_cFv = .text:0x8026D830; // type:function size:0x68 +registerRupeeOrTreasureDowsing__9dAcTbox_cFv = .text:0x8026D8A0; // type:function size:0x48 +noUnregisterDowsing__9dAcTbox_cFv = .text:0x8026D8F0; // type:function size:0x4 +unregisterDowsing__9dAcTbox_cFv = .text:0x8026D900; // type:function size:0x48 fn_8026D950 = .text:0x8026D950; // type:function size:0x28 -checkIsClear = .text:0x8026D980; // type:function size:0x140 +checkIsClear__9dAcTbox_cCFv = .text:0x8026D980; // type:function size:0x140 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 @@ -28645,7 +28645,7 @@ lbl_804ED998 = .rodata:0x804ED998; // type:object size:0xC lbl_804ED9A4 = .rodata:0x804ED9A4; // type:object size:0x14 ITEM_MODELS = .rodata:0x804ED9B8; // type:object size:0xA00 lbl_804EE3B8 = .rodata:0x804EE3B8; // type:object size:0xC0 data:4byte -lbl_804EE478 = .rodata:0x804EE478; // type:object size:0xD0 data:4byte +@LOCAL@checkIsClear__9dAcTbox_cCFv@fsIdxes@0 = .rodata:0x804EE478; // type:object size:0xD0 data:4byte lbl_804EE548 = .rodata:0x804EE548; // type:object size:0x30 lbl_804EE578 = .rodata:0x804EE578; // type:object size:0x30 data:float TgMassObj__GRASS_A_TYPES = .rodata:0x804EE5A8; // type:object size:0xF8 data:4byte @@ -40245,7 +40245,7 @@ sCurrentObtainingItemOarcName = .sbss:0x80575918; // type:object size:0x4 data:4 @GUARD@create__9dAcTbox_cFv@bbLo@9 = .sbss:0x80575924; // type:object size:0x1 data:byte @GUARD@create__9dAcTbox_cFv@bbUp@10 = .sbss:0x80575925; // type:object size:0x1 data:byte @GUARD@draw__9dAcTbox_cFv@shadowDirs = .sbss:0x80575926; // type:object size:0x1 data:byte -lbl_80575927 = .sbss:0x80575927; // type:object size:0x1 data:byte +@GUARD@checkIsClear__9dAcTbox_cCFv@offsets = .sbss:0x80575927; // type:object size:0x1 data:byte lbl_80575928 = .sbss:0x80575928; // type:object size:0x8 data:byte TgMassObj__MASS_OBJ_TAG_PTR = .sbss:0x80575930; // type:object size:0x4 data:4byte lbl_80575934 = .sbss:0x80575934; // type:object size:0x4 data:4byte @@ -49025,7 +49025,7 @@ StateID_Wait__9dAcTbox_c = .bss:0x805B52D8; // type:object size:0x30 data:4byte StateID_GoddessWait__9dAcTbox_c = .bss:0x805B5318; // type:object size:0x30 data:4byte lbl_805B5348 = .bss:0x805B5348; // type:object size:0xA0 lbl_805B53E8 = .bss:0x805B53E8; // type:object size:0x40 data:4byte -lbl_805B5428 = .bss:0x805B5428; // type:object size:0x30 data:float +@LOCAL@checkIsClear__9dAcTbox_cCFv@offsets = .bss:0x805B5428; // type:object size:0x30 data:float lbl_805B5458 = .bss:0x805B5458; // type:object size:0x10 AcTimeArea__STATE_WAIT = .bss:0x805B5468; // type:object size:0x40 data:4byte AcTimeArea__STATE_SLOPE = .bss:0x805B54A8; // type:object size:0x40 data:4byte diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index c68b886b..674bb119 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -55,6 +55,7 @@ public: static int getTotalArrowCount(); static int getTotalSeedCount(); + static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); static bool isTreasure(ITEM_ID item); diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 9e86f68e..015fb613 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -66,6 +66,9 @@ public: virtual int actorExecuteInEvent() override; virtual int draw() override; + virtual void registerInEvent() override; + virtual void unkVirtFunc_0x6C() override; + virtual void *getObjectListEntry() override; STATE_FUNC_DECLARE(dAcTbox_c, DugOut); @@ -83,7 +86,8 @@ public: STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait); private: - bool initBgW(dBgW &bg, const char *arcName, const char *ccName); + static f32 getSomeRate(); + bool initBgW(dBgW &bg, const char *arcName, const char *fileName); bool isNotSmall() const; void setItemId(u16 item); void setChestFlag(); @@ -99,6 +103,9 @@ private: bool checkTboxFlag() const; bool fn_8026D560() const; bool isItemRupee() const; + + void getDowsingTargetOffset(mVec3_c *offset) const; + void initDowsingTarget(DowsingTarget *target, DowsingTarget::DowsingSlot slot, mVec3_c *offset); void initDowsingTarget(DowsingTarget::DowsingSlot slot); void initDowsingTargetCube(); @@ -126,8 +133,13 @@ private: void setFlags(u32 flags); + bool fn_8026D120() const; + void fn_8026D130(); void fn_8026D140(); + void fn_8026D950(); + bool checkIsClear() const; + static bool fn_802686F0(const mVec3_c &vec, f32 y); const InteractionTargetDef &getInteractionTargetDef() const; /* 0x0330 */ m3d::mdlAnmChr mMdl1; @@ -158,12 +170,15 @@ private: /* 0x10E8 */ fLiNdBa_c mTboxListNode; /* 0x10F4 */ ActorEventRelated mEvent; /* 0x1144 */ dAcRef_c mItemRef; - /* 0x1150 */ DowsingTarget mDowsingTarget1; - /* 0x1170 */ DowsingTarget mDowsingTarget2; + /* 0x1150 */ DowsingTarget mDowsingTarget; + /* 0x1170 */ DowsingTarget mGoddessDowsingTarget; /* 0x1190 */ void (dAcTbox_c::*mRegisterDowsingTarget)(); /* 0x119C */ void (dAcTbox_c::*mUnregisterDowsingTarget)(); - /* 0x11A8 */ u8 field_0x11A8[0x11D8 - 0x11A8]; + /* 0x11A8 */ u8 field_0x11A8[0x11C0 - 0x11A8]; + + /* 0x11C0 */ mVec3_c field_0x11C0; + /* 0x11CC */ mVec3_c field_0x11CC; /* 0x11D8 */ mVec3_c field_0x11D8; @@ -174,7 +189,7 @@ private: /* 0x11F0 */ UNKWORD field_0x11F0; /* 0x11F4 */ UNKWORD field_0x11F4; - /* 0x11F8 */ u8 field_0x11F8[0x11FC - 0x11F8]; + /* 0x11F8 */ UNKWORD field_0x11F8; /* 0x11FC */ UNKWORD field_0x11FC; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 44f43d3b..49791e31 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -889,9 +889,6 @@ public: void OnTgSet() { mTg.OnSPrm(1); } - void OffTgSet() { - mTg.OffSPrm(1); - } u32 GetTgGrp() const { return mTg.MskSPrm(0x3E); } diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 702e8f92..203258e1 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -5,11 +5,13 @@ #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" +#include "d/col/bg/d_bg_s.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" +#include "m/m3d/m_scnleaf.h" #include "m/m_mtx.h" #include "m/m_vec.h" #include "nw4r/g3d/g3d_resanmchr.h" @@ -21,6 +23,7 @@ #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/attention.h" #include "toBeSorted/dowsing_target.h" +#include "toBeSorted/event_manager.h" #include "toBeSorted/room_manager.h" SPECIAL_ACTOR_PROFILE(TBOX, dAcTbox_c, fProfile::TBOX, 0x018D, 0, 6); @@ -751,9 +754,13 @@ static char *const sOpenCcNames[] = { "GoddessTBoxOpen", }; +f32 dAcTbox_c::getSomeRate() { + return 1.0f / 8.333333f; +} + 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) { + mDowsingTarget(this, DowsingTarget::SLOT_NONE), mGoddessDowsingTarget(this, DowsingTarget::SLOT_NONE) { field_0x120B = 0; field_0x120E = 0; mDoObstructedCheck = false; @@ -889,7 +896,7 @@ bool dAcTbox_c::createHeap() { return true; } -static u32 sSomeCounters[16] = {}; +static u32 sSomeCounters[16] = {0}; int dAcTbox_c::create() { if (!isActualVisibleBox()) { @@ -958,7 +965,7 @@ int dAcTbox_c::create() { if (b) { other->deleteRequest(); - field_0x120D = true; + other->field_0x120D = true; } else { field_0x120D = true; return FAILED; @@ -1005,7 +1012,7 @@ int dAcTbox_c::create() { {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; mCcD3.Set(s1); - mCcD4.SetStts(mStts); + mCcD3.SetStts(mStts); static const dCcD_SrcCyl s2 = { sColSrc, {1.0f, 1.0f}, @@ -1245,7 +1252,7 @@ int dAcTbox_c::actorExecute() { mCcD2.Set(v1, v2); mCcD2.Set(field_0x11D8, rotation.y); } else { - mCcD2.OffTgSet(); + mCcD2.ClrTgSet(); } field_0x0D48.registerColliders(); } @@ -1431,7 +1438,7 @@ int dAcTbox_c::actorExecuteInEvent() { mCcD2.Set(v1, v2); mCcD2.Set(field_0x11D8, rotation.y); } else { - mCcD2.OffTgSet(); + mCcD2.ClrTgSet(); } field_0x0D48.registerColliders(); } @@ -1553,9 +1560,102 @@ const mVec3_c &dAcTbox_c::fn_8026B3C0() const { return v2; } -void dAcTbox_c::initializeState_DugOut() {} -void dAcTbox_c::executeState_DugOut() {} +void dAcTbox_c::initializeState_DugOut() { + mScale.set(0.0f, 0.0f, 1.0f); + field_0x11E8 = 0.0f; + field_0x11F4 &= ~2; + if (mHasBeenOpened == 1) { + field_0x120C = 1; + } else { + field_0x120C = 0; + } + setActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + if (checkTboxFlag()) { + mMdl1.setFrame(mMdl1.getAnm().getEndFrame()); + } else { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D140(); +} +void dAcTbox_c::executeState_DugOut() { + field_0x11F4 |= 2; + if (field_0x11E8 < 1.0f) { + bool result = sLib::chase(&field_0x11E8, 1.0f, 0.2f); + switch ((u32)mVariant) { + case NORMAL: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + } else { + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + } + break; + case SMALL: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-38.0f, 0.0f, -68.0f); + field_0x11CC.set(38.0f, 101.0f, 31.0f); + } else { + field_0x11C0.set(-38.0f, 0.0f, -35.0f); + field_0x11CC.set(38.0f, 68.0f, 35.0f); + } + break; + case BOSS: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-90.0f, 0.0f, -135.0f); + field_0x11CC.set(90.0f, 163.0f, 56.0f); + } else { + field_0x11C0.set(-90.0f, 0.0f, -53.0f); + field_0x11CC.set(90.0f, 133.0f, 56.0f); + } + break; + case GODDESS: + if (mHasBeenOpened == 1) { + field_0x11C0.set(-62.0f, 0.0f, -95.0f); + field_0x11CC.set(62.0f, 140.0f, 47.0f); + } else { + field_0x11C0.set(-62.0f, 0.0f, -47.0f); + field_0x11CC.set(62.0f, 100.0f, 47.0f); + } + break; + } + field_0x11C0 *= field_0x11E8; + field_0x11CC *= field_0x11E8; + if (!result) { + return; + } + } + + bool bX = sLib::chase(&mScale.x, 1.0f, 0.2f); + bool bY = sLib::chase(&mScale.y, 1.0f, 0.2f); + if (bX && bY) { + if (mVariant == GODDESS) { + if (mHasBeenOpened == true) { + mStateMgr.changeState(StateID_GoddessWait); + } else { + if (StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + mStateMgr.changeState(StateID_GoddessWaitOn); + } else { + mStateMgr.changeState(StateID_GoddessWaitOff); + } + } + } else if (mHasBeenOpened == true) { + mStateMgr.changeState(StateID_Wait); + } else { + mStateMgr.changeState(StateID_WaitOpen); + } + } +} void dAcTbox_c::finalizeState_DugOut() {} + void dAcTbox_c::initializeState_WaitAppear() { mScale.set(0.0f, 0.0f, 0.0f); setActorProperty(0x100); @@ -1563,7 +1663,8 @@ void dAcTbox_c::initializeState_WaitAppear() { field_0x11E8 = 0.0f; field_0x11F4 &= ~0x2; field_0x120C = 0; - // field_0x11C0 + field_0x11C0.set(0.0f, 0.0f, 0.0f); + field_0x11CC.set(0.0f, 0.0f, 0.0f); } void dAcTbox_c::executeState_WaitAppear() { // @bug doIt is uninitialized here, so WaitAppear is UB unless field_0x120A == 0 or field_0x120A == 3 @@ -1579,22 +1680,155 @@ void dAcTbox_c::executeState_WaitAppear() { } } void dAcTbox_c::finalizeState_WaitAppear() {} + void dAcTbox_c::initializeState_DemoAppear() { - // TODO, just referencing this bit of data + field_0x11F8 = 0; + mScale.set(0.0f, 0.0f, 0.0f); + field_0x11E8 = 0.0f; + setActorProperty(0x100); mMdl1.setAnm(sAppearAnmName, m3d::PLAY_MODE_4); + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + mAnmMatClr1.setFrame(0.0f, 0); + fn_8026D140(); + field_0x11E8 = 0.0f; + field_0x11F4 &= ~0x2; + field_0x120C = 0; + field_0x11C0.set(0.0f, 0.0f, 0.0f); + field_0x11CC.set(0.0f, 0.0f, 0.0f); +} +extern "C" void SmallSoundManager__playSound(void *, u32); +extern "C" void *SOUND_EFFECT_SOUND_MGR; +void dAcTbox_c::executeState_DemoAppear() { + int val = field_0x11F8++; + if (field_0x11F8 < 11) { + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + f32 f = field_0x11F8 * 0.1f; + field_0x11C0 *= f; + field_0x11CC *= f; + } + if (field_0x11F8 >= 20) { + bool b = val < 20; + if (b) { + fn_8026D950(); + } + if (b) { + mScale.set(1.0f, 1.0f, 1.0f); + } + bool wasStop = mMdl1.getAnm().isStop(); + if (!wasStop) { + mMdl1.play(); + } + bool isStop = mMdl1.getAnm().isStop(); + if (!wasStop) { + field_0x11E8 = mMdl1.getAnm().getFrame() / (mMdl1.getAnm().getEndFrame() - mMdl1.getAnm().getStartFrame()); + } + if (0.0f < field_0x11E8) { + field_0x11F4 |= 2; + } + mAnmMatClr1.play(); + if (isStop && mAnmMatClr1.isStop(0) && field_0x11F8 > 0x5A) { + mEvent.advanceNext(); + mStateMgr.changeState(StateID_WaitOpen); + SmallSoundManager__playSound(SOUND_EFFECT_SOUND_MGR, 0x13AD); + } + } } -void dAcTbox_c::executeState_DemoAppear() {} void dAcTbox_c::finalizeState_DemoAppear() {} -void dAcTbox_c::initializeState_WaitOpen() {} -void dAcTbox_c::executeState_WaitOpen() {} -void dAcTbox_c::finalizeState_WaitOpen() {} -void dAcTbox_c::initializeState_GoddessWaitOff() {} + +void dAcTbox_c::initializeState_WaitOpen() { + mScale.set(1.0f, 1.0f, 1.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + switch ((u32)mVariant) { + case NORMAL: + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + break; + case SMALL: + field_0x11C0.set(-38.0f, 0.0f, -35.0f); + field_0x11CC.set(38.0f, 68.0f, 35.0f); + break; + case BOSS: + field_0x11C0.set(-90.0f, 0.0f, -53.0f); + field_0x11CC.set(90.0f, 133.0f, 56.0f); + break; + // WaitOpen not used for Goddess Chests + } + field_0x120C = 0; + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D130(); +} +void dAcTbox_c::executeState_WaitOpen() { + if ((!mDoObstructedCheck || checkIsClear()) && fn_8026D120()) { + AttentionManager *mgr = AttentionManager::sInstance; + mgr->addTarget(*this, getInteractionTargetDef(), 0, nullptr); + } +} +void dAcTbox_c::finalizeState_WaitOpen() { + (this->*mUnregisterDowsingTarget)(); +} + +void dAcTbox_c::initializeState_GoddessWaitOff() { + clearActorProperty(0x100); + fn_8026D130(); + field_0x11C0.set(-62.0f, 0.0f, -47.0f); + field_0x11CC.set(62.0f, 100.0f, 47.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 0; +} void dAcTbox_c::executeState_GoddessWaitOff() {} void dAcTbox_c::finalizeState_GoddessWaitOff() {} -void dAcTbox_c::initializeState_GoddessWaitOn() {} -void dAcTbox_c::executeState_GoddessWaitOn() {} -void dAcTbox_c::finalizeState_GoddessWaitOn() {} -void dAcTbox_c::initializeState_DeleteArchive() {} + +void dAcTbox_c::initializeState_GoddessWaitOn() { + clearActorProperty(0x100); + fn_8026D130(); + field_0x11C0.set(-62.0f, 0.0f, -47.0f); + field_0x11CC.set(62.0f, 100.0f, 47.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + mGoddessDowsingTarget.doRegister(); +} +void dAcTbox_c::executeState_GoddessWaitOn() { + if (fn_8026D120()) { + AttentionManager *mgr = AttentionManager::sInstance; + mgr->addTarget(*this, getInteractionTargetDef(), 0, nullptr); + } +} +void dAcTbox_c::finalizeState_GoddessWaitOn() { + (this->*mUnregisterDowsingTarget)(); + mGoddessDowsingTarget.doUnregister(); +} + +void dAcTbox_c::initializeState_DeleteArchive() { + mScale.set(1.0f, 1.0f, 1.0f); + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D140(); + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 0; +} void dAcTbox_c::executeState_DeleteArchive() { if (sCurrentObtainingItemOarcName != nullptr) { OarcManager *mng = OarcManager::sInstance; @@ -1613,30 +1847,175 @@ void dAcTbox_c::executeState_DeleteArchive() { } } void dAcTbox_c::finalizeState_DeleteArchive() {} -void dAcTbox_c::initializeState_LoadArchive() {} -void dAcTbox_c::executeState_LoadArchive() {} + +void dAcTbox_c::initializeState_LoadArchive() { + mScale.set(1.0f, 1.0f, 1.0f); + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sMdlNames[0], m3d::PLAY_MODE_4); + } + if (mVariant == NORMAL) { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D140(); + sCurrentObtainingItemOarcName = sItemToArchiveName[mItemModelIdx]; + OarcManager::sInstance->loadObjectArcFromDisk(sCurrentObtainingItemOarcName, nullptr); + field_0x11C0.set(-61.0f, 0.0f, -42.0f); + field_0x11CC.set(61.0f, 100.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 0; +} +void dAcTbox_c::executeState_LoadArchive() { + if (!OarcManager::sInstance->ensureLoaded1(sCurrentObtainingItemOarcName)) { + mStateMgr.changeState(StateID_Open); + } +} void dAcTbox_c::finalizeState_LoadArchive() {} + void dAcTbox_c::initializeState_Open() {} void dAcTbox_c::executeState_Open() {} void dAcTbox_c::finalizeState_Open() {} + void dAcTbox_c::initializeState_PresentItem() {} void dAcTbox_c::executeState_PresentItem() {} void dAcTbox_c::finalizeState_PresentItem() {} + void dAcTbox_c::initializeState_Close() {} void dAcTbox_c::executeState_Close() {} void dAcTbox_c::finalizeState_Close() {} + void dAcTbox_c::initializeState_Wait() {} void dAcTbox_c::executeState_Wait() {} void dAcTbox_c::finalizeState_Wait() {} + void dAcTbox_c::initializeState_GoddessWait() {} void dAcTbox_c::executeState_GoddessWait() {} void dAcTbox_c::finalizeState_GoddessWait() {} +extern "C" dAcBase_c *getCurrentEventActor(); + +void dAcTbox_c::registerInEvent() { + if (getCurrentEventActor() == mItemRef.get()) { + if (EventManager::isCurrentEvent("ItemGetDefaultTBox") || EventManager::isCurrentEvent("ItemGetGorgeousTBox")) { + field_0x11F4 |= 0x8; + } + } +} + +void dAcTbox_c::unkVirtFunc_0x6C() { + if ((field_0x11F4 & 8) != 0) { + if (mVariant == GODDESS && mHasBeenOpened == true) { + mAnmGoddessPat.setFrame(0.0f, 0); + } + field_0x11F4 &= ~8; + } +} + bool dAcTbox_c::isNotSmall() const { return mVariant != SMALL; } -extern "C" const u32 DAT_804ee478[] = {0, 0, 1, 1}; +void dAcTbox_c::syncScaleToMdl(m3d::scnLeaf_c *lf) { + lf->setScale(mScale); +} + +bool dAcTbox_c::initBgW(dBgW &bg, const char *arcName, const char *fileName) { + void *dzb = getOarcDZB(arcName, fileName); + if (dzb == nullptr) { + return false; + } + void *plc = getOarcPLC(arcName, fileName); + if (plc == nullptr) { + return false; + } + // TODO return types + bool ok = !(BOOL)bg.Set((cBgD_t *)dzb, (PLC *)plc, 0x81, &mWorldMtx, &mScale); + if (!ok) { + return false; + } + bg.SetCrrFunc(dBgS_MoveBGProc_TypicalRotY); + return true; +} + +void dAcTbox_c::initDowsingTarget(DowsingTarget *target, DowsingTarget::DowsingSlot slot, mVec3_c *offset) { + target->initialize(slot, 0, offset, 0.0f); +} + +bool dAcTbox_c::isItemRupee() const { + return dAcItem_c::isRupee((ITEM_ID)mItemId); +} + +void dAcTbox_c::initDowsingTarget(DowsingTarget::DowsingSlot slot) { + mVec3_c offset; + getDowsingTargetOffset(&offset); + initDowsingTarget(&mDowsingTarget, slot, &offset); +} + +void dAcTbox_c::initDowsingTargetCube() { + mVec3_c offset; + getDowsingTargetOffset(&offset); + initDowsingTarget(&mGoddessDowsingTarget, DowsingTarget::SLOT_GODDESS_CUBE, &offset); +} + +void dAcTbox_c::noRegisterDowsing() {} + +void dAcTbox_c::registerKeyPieceDowsing() { + if ((field_0x11F4 & 4) == 0 && StoryflagManager::sInstance->getCounterOrFlag(0x6A)) { + mDowsingTarget.doRegister(); + field_0x11F4 |= 4; + } +} + +void dAcTbox_c::registerRupeeOrTreasureDowsing() { + if ((field_0x11F4 & 4) == 0) { + mDowsingTarget.doRegister(); + field_0x11F4 |= 4; + } +} + +void dAcTbox_c::noUnregisterDowsing() {} + +void dAcTbox_c::unregisterDowsing() { + if ((field_0x11F4 & 4) != 0) { + mDowsingTarget.doUnregister(); + field_0x11F4 &= ~4; + } +} + +bool dAcTbox_c::checkIsClear() const { + f32 fs[] = { + position.y, + position.y, + }; + fs[0] += 20.0f; + fs[1] += 60.0f; + static mVec3_c offsets[] = { + mVec3_c(50.0f, 500.0f, 50.0f), + mVec3_c(50.0f, 500.0f, -50.0f), + mVec3_c(-50.0f, 500.0f, 50.0f), + mVec3_c(-50.0f, 500.0f, -50.0f), + }; + mVec3_c points[4]; + for (u32 i = 0; i <= 3; i++) { + fn_8026DAD0(&offsets[i], &points[i]); + } + static const int fsIdxes[] = {0, 0, 1, 1}; + bool isClear = true; + for (u32 i = 0; isClear && i <= 3;) { + // @bug should this be points[i] instead? + if (fn_802686F0(points[0], fs[fsIdxes[i]])) { + isClear = false; + } else { + i++; + } + } + + return isClear; +} const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { switch ((u32)mVariant) {