diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 49bc3aa4..3839df84 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -44,6 +44,9 @@ d/a/obj/d_a_obj_base.cpp: d/a/e/d_a_e_base.cpp: .text start:0x8002F300 end:0x80030CB0 .ctors start:0x804DB664 end:0x804DB668 + .data start:0x80501638 end:0x805016E0 + .sbss start:0x80575098 end:0x805750A0 + .bss start:0x80597020 end:0x80597030 d/a/npc/d_a_npc.cpp: .text start:0x80030CB0 end:0x8003F718 @@ -67,8 +70,14 @@ d/d_base.cpp: .data start:0x80503380 end:0x805033D0 .sbss start:0x805750C0 end:0x805750CC +d/d_carry.cpp: + .text start:0x80050A20 end:0x80051BF8 + .data start:0x805033D0 end:0x805033E0 + .sdata2 start:0x80576ED8 end:0x80576F20 + d/d_cc.cpp: - .text start:0x80050A20 end:0x800520F0 + .text start:0x80051C00 end:0x800520F0 + .data start:0x805033E0 end:0x805033F0 d/d_dvd.cpp: .text start:0x800520F0 end:0x800522FC @@ -215,15 +224,20 @@ d/d_textunk.cpp: .bss start:0x805A6F70 end:0x805A7730 d/d_tag_processor.cpp: - .text start:0x800B35C0 end:0x800B9274 + .text start:0x800B34F0 end:0x800B9274 .ctors start:0x804DB6D4 end:0x804DB6D8 - .rodata start:0x804E4C34 end:0x804E4C50 + .rodata start:0x804E39E0 end:0x804E4C50 .data start:0x805108E8 end:0x805109A0 - .sdata2 start:0x8057986C end:0x805798D0 + .sdata2 start:0x80579868 end:0x805798D0 .bss start:0x805A7730 end:0x805A78B8 toBeSorted/time_area_mgr.cpp: - .text start:0x800B9280 end:0x800BB2A0 + .text start:0x800B9280 end:0x800BC978 + .ctors start:0x804DB6D8 end:0x804DB6DC + .data start:0x805109A0 end:0x80510B30 + .sdata start:0x805722E0 end:0x805722F8 + .sbss start:0x805753C0 end:0x805753D0 + .sdata2 start:0x805798D0 end:0x80579928 d/flag/flag_managers.cpp: .text start:0x800BD8C0 end:0x800C0650 @@ -650,7 +664,12 @@ d/a/obj/d_a_obj_fairy.cpp: d/a/obj/d_a_obj_tbox.cpp: .text start:0x802685A0 end:0x8026F488 .ctors start:0x804DB83C end:0x804DB840 + .rodata start:0x804ED3B0 end:0x804EE548 .data start:0x80535270 end:0x80535A18 + .sdata start:0x80573A48 end:0x80573A50 + .sbss start:0x80575910 end:0x80575928 + .sdata2 start:0x8057C238 end:0x8057C3F0 + .bss start:0x805B4FA8 end:0x805B5458 d/a/obj/d_a_obj_time_area.cpp: .text start:0x8026F490 end:0x80271888 @@ -806,7 +825,18 @@ DynamicLink.cpp: .sbss start:0x80575B80 end:0x80575BA0 c/c_list.cpp: - .text start:0x802E08C0 end:0x802E0A10 + .text start:0x802E08C0 end:0x802E0A50 + +c/c_math.cpp: + .text start:0x802E0A50 end:0x802E0CF8 + .data start:0x80541A70 end:0x80542278 + .sdata2 start:0x8057CC58 end:0x8057CC80 + +c/c_rand.cpp: + .text start:0x802E0D00 end:0x802E0E64 + .ctors start:0x804DB8BC end:0x804DB8C0 + .sdata start:0x80573FB0 end:0x80573FB8 + .sdata2 start:0x8057CC80 end:0x8057CC98 c/c_tree.cpp: .text start:0x802E0E70 end:0x802E1140 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 6e25ecc3..260f1e70 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -798,8 +798,8 @@ fn_800220D0 = .text:0x800220D0; // type:function size:0xD0 fn_800221A0 = .text:0x800221A0; // type:function size:0xC4 fn_80022270 = .text:0x80022270; // type:function size:0x5C fn_800222D0 = .text:0x800222D0; // type:function size:0xC8 -fn_800223A0 = .text:0x800223A0; // type:function size:0x94 -fn_80022440 = .text:0x80022440; // type:function size:0x34 +fn_800223A0__21BlurAndPaletteManagerFPv = .text:0x800223A0; // type:function size:0x94 +fn_80022440__21BlurAndPaletteManagerFPv = .text:0x80022440; // type:function size:0x34 fn_80022480 = .text:0x80022480; // type:function size:0xCC fn_80022550 = .text:0x80022550; // type:function size:0x74 Vec3f__copy = .text:0x800225D0; // type:function size:0x1C @@ -810,7 +810,7 @@ fn_800227F0 = .text:0x800227F0; // type:function size:0xF0 fn_800228E0 = .text:0x800228E0; // type:function size:0xEC fn_800229D0 = .text:0x800229D0; // type:function size:0x34 fn_80022A10 = .text:0x80022A10; // type:function size:0xD8 -fn_80022AF0 = .text:0x80022AF0; // type:function size:0x3C +fn_80022AF0__21BlurAndPaletteManagerFf = .text:0x80022AF0; // type:function size:0x3C fn_80022B30 = .text:0x80022B30; // type:function size:0x8 fn_80022B40 = .text:0x80022B40; // type:function size:0x58 fn_80022BA0 = .text:0x80022BA0; // type:function size:0xC @@ -854,7 +854,7 @@ fn_800246D0 = .text:0x800246D0; // type:function size:0x64 fn_80024740 = .text:0x80024740; // type:function size:0x24 fn_80024770 = .text:0x80024770; // type:function size:0x24 fn_800247A0 = .text:0x800247A0; // type:function size:0x30 -fn_800247D0 = .text:0x800247D0; // type:function size:0x20 +fn_800247D0__21BlurAndPaletteManagerF7mVec3_cf = .text:0x800247D0; // type:function size:0x20 createBlurAndPaletteMgr = .text:0x800247F0; // type:function size:0xBB0 Vec3f__ctor = .text:0x800253A0; // type:function size:0x10 fn_800253B0 = .text:0x800253B0; // type:function size:0xC @@ -1102,12 +1102,12 @@ FUN_8002dd10__9dAcBase_cFv = .text:0x8002DD10; // type:function size:0x3C FUN_8002dd50__9dAcBase_cFv = .text:0x8002DD50; // type:function size:0x34 FUN_8002dd90__9dAcBase_cFv = .text:0x8002DD90; // type:function size:0x3C FUN_8002ddd0__9dAcBase_cFv = .text:0x8002DDD0; // type:function size:0x54 -FUN_8002de30__9dAcBase_cFv = .text:0x8002DE30; // type:function size:0x4 +FUN_8002de30__9dAcBase_cFR13cBgS_PolyInfo = .text:0x8002DE30; // type:function size:0x4 getOarcFile__12dAcObjBase_cFPCcPCc = .text:0x8002DE40; // type:function size:0x14 ActorObjectBase__getOarcSubentry = .text:0x8002DE60; // type:function size:0x14 getOarcResFile__12dAcObjBase_cFPCc = .text:0x8002DE80; // type:function size:0xC ActorObjectBase__getOarcModelFile = .text:0x8002DE90; // type:function size:0xC -ActorObjectBase__getOarcZev = .text:0x8002DEA0; // type:function size:0xC +getOarcZev__12dAcObjBase_cFPCc = .text:0x8002DEA0; // type:function size:0xC getOarcDZB__12dAcObjBase_cFPCcPCc = .text:0x8002DEB0; // type:function size:0x14 getOarcPLC__12dAcObjBase_cFPCcPCc = .text:0x8002DED0; // type:function size:0x14 __ct__12dAcObjBase_cFv = .text:0x8002DEF0; // type:function size:0x158 @@ -2096,17 +2096,17 @@ 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 -CarriedActorCtor = .text:0x80050A20; // type:function size:0x118 -CarriedActorDtor = .text:0x80050B40; // type:function size:0x80 +__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 = .text:0x80050EB0; // type:function size:0x140 +fn_80050EB0__16ActorCarryStructFP12dAcObjBase_c = .text:0x80050EB0; // type:function size:0x140 bushTpFunc__16ActorCarryStructFR9dBgS_Acch = .text:0x80050FF0; // type:function size:0x19C -fn_80051190 = .text:0x80051190; // type:function size:0x4C +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 fn_80051440 = .text:0x80051440; // type:function size:0x17C @@ -2115,31 +2115,31 @@ fn_800515D0 = .text:0x800515D0; // type:function size:0x60 fn_800051630__13dAcObjRef_unkFv = .text:0x80051630; // type:function size:0x144 fn_80051780__13dAcObjRef_unkFRC8cCcD_Obj = .text:0x80051780; // type:function size:0x464 fn_80051BF0 = .text:0x80051BF0; // type:function size:0x8 -fn_80051C00 = .text:0x80051C00; // type:function size:0x4C -InitColliderAndAddToFront = .text:0x80051C50; // type:function size:0x5C -fn_80051CB0 = .text:0x80051CB0; // type:function size:0x5C -InitCollider2AndAddToFront = .text:0x80051D10; // type:function size:0x5C -fn_80051D70 = .text:0x80051D70; // type:function size:0x5C -fn_80051DD0 = .text:0x80051DD0; // type:function size:0x64 -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 -fn_80051F10 = .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 -fn_80051FD0 = .text:0x80051FD0; // type:function size:0x10 -fn_80051FE0 = .text:0x80051FE0; // type:function size:0x10 -fn_80051FF0 = .text:0x80051FF0; // type:function size:0x1C -fn_80052010 = .text:0x80052010; // type:function size:0x10 -fn_80052020 = .text:0x80052020; // type:function size:0x10 -fn_80052030 = .text:0x80052030; // type:function size:0x10 -fn_80052040 = .text:0x80052040; // type:function size:0x1C -fn_80052060 = .text:0x80052060; // type:function size:0x10 -fn_80052070 = .text:0x80052070; // type:function size:0x10 -fn_80052080 = .text:0x80052080; // type:function size:0x10 -fn_80052090 = .text:0x80052090; // type:function size:0x60 +postInit__19dColliderLinkedListFR8cCcD_Obj = .text:0x80051C00; // type:function size:0x4C +addCc__19dColliderLinkedListFR15dCcD_Linked_CylRC11dCcD_SrcCyl = .text:0x80051C50; // type:function size:0x5C +addCc__19dColliderLinkedListFR15dCcD_Linked_SphRC11dCcD_SrcSph = .text:0x80051CB0; // type:function size:0x5C +addCc__19dColliderLinkedListFR15dCcD_Linked_CpsRC11dCcD_SrcCps = .text:0x80051D10; // type:function size:0x5C +addCc__19dColliderLinkedListFR15dCcD_Linked_UnkRC11dCcD_SrcUnk = .text:0x80051D70; // type:function size:0x5C +foreachCc__19dColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051DD0; // type:function size:0x64 +foreachCc2__19dColliderLinkedListCFPFP8cCcD_ObjPv_vPv = .text:0x80051E40; // type:function size:0x64 +Set__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051EB0; // type:function size:0x34 +registerColliders__19dColliderLinkedListFv = .text:0x80051EF0; // type:function size:0x10 +SetStts__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051F00; // type:function size:0x8 +SetStts__19dColliderLinkedListFR9cCcD_Stts = .text:0x80051F10; // type:function size:0x10 +find__19dColliderLinkedListCFM8cCcD_ObjFPCvPv_b = .text:0x80051F20; // type:function size:0x74 +AtSet__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FA0; // type:function size:0x1C +AtSet__19dColliderLinkedListFv = .text:0x80051FC0; // type:function size:0x10 +ClrAt__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FD0; // type:function size:0x10 +ClrAt__19dColliderLinkedListFv = .text:0x80051FE0; // type:function size:0x10 +TgSet__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80051FF0; // type:function size:0x1C +TgSet__19dColliderLinkedListFv = .text:0x80052010; // type:function size:0x10 +ClrTg__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80052020; // type:function size:0x10 +ClrTg__19dColliderLinkedListFv = .text:0x80052030; // type:function size:0x10 +CoSet__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80052040; // type:function size:0x1C +CoSet__19dColliderLinkedListFv = .text:0x80052060; // type:function size:0x10 +ClrCo__19dColliderLinkedListFP8cCcD_ObjPv = .text:0x80052070; // type:function size:0x10 +ClrCo__19dColliderLinkedListFv = .text:0x80052080; // type:function size:0x10 +__dt__19dColliderLinkedListFv = .text:0x80052090; // type:function size:0x60 create__4dDvdFlPQ23EGG4HeapPQ23EGG4HeapPQ23EGG4Heap = .text:0x800520F0; // type:function size:0x4 __ct__Q24dDvd8loader_cFv = .text:0x80052100; // type:function size:0x28 __dt__Q24dDvd8loader_cFv = .text:0x80052130; // type:function size:0x40 @@ -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 @@ -3569,7 +3569,7 @@ fn_8009F990 = .text:0x8009F990; // type:function size:0x80 fn_8009FA10 = .text:0x8009FA10; // type:function size:0x8 attachSkipEvent = .text:0x8009FA20; // type:function size:0x1A0 setAsEvent = .text:0x8009FBC0; // type:function size:0x120 -dBase_c__changeOwnEvent = .text:0x8009FCE0; // type:function size:0x11C +changeOwnEvent__12EventManagerFP9dAcBase_cP9dAcBase_cP5Eventi = .text:0x8009FCE0; // type:function size:0x11C fn_8009FE00 = .text:0x8009FE00; // type:function size:0x124 isInEvent__12EventManagerFP9dAcBase_cPCc = .text:0x8009FF30; // type:function size:0x10C fn_800A0040 = .text:0x800A0040; // type:function size:0x114 @@ -3597,8 +3597,8 @@ fn_800A09B0 = .text:0x800A09B0; // type:function size:0x1D0 fn_800A0B80 = .text:0x800A0B80; // type:function size:0x10 eventRelatedStateFlags_shift0x11_1 = .text:0x800A0B90; // type:function size:0x10 fn_800A0BA0 = .text:0x800A0BA0; // type:function size:0x94 -__ct__5EventFPcUlUlPvPv = .text:0x800A0C40; // type:function size:0xEC -Event__createSimple = .text:0x800A0D30; // type:function size:0xEC +__ct__5EventFPCcUlUlPvPv = .text:0x800A0C40; // type:function size:0xEC +__ct__5EventFPCcPvUlUlPvPv = .text:0x800A0D30; // type:function size:0xEC __ct__5EventFUllUlPvPv = .text:0x800A0E20; // type:function size:0x208 Event__Event4 = .text:0x800A1030; // type:function size:0x208 __dt__5EventFv = .text:0x800A1240; // type:function size:0x40 @@ -13466,7 +13466,7 @@ AcItem__isSingleArrow = .text:0x802509A0; // type:function size:0x10 isItem5Bombs = .text:0x802509B0; // type:function size:0x10 isItem10Bombs = .text:0x802509C0; // type:function size:0x10 isItemBundleOfArrows = .text:0x802509D0; // type:function size:0x10 -AcItem__isKeyPiece = .text:0x802509E0; // type:function size:0x10 +isKeyPiece__9dAcItem_cF7ITEM_ID = .text:0x802509E0; // type:function size:0x10 isItem5GratitudeCrystals = .text:0x802509F0; // type:function size:0x10 AcItem__isFaroreTear = .text:0x80250A00; // type:function size:0x10 AcItem__IsDinTear = .text:0x80250A10; // type:function size:0x10 @@ -13486,13 +13486,13 @@ 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 AcItem__isBug = .text:0x80250D50; // type:function size:0x7C AcItem__isTreasure = .text:0x80250DD0; // type:function size:0x138 -AcItem__isTreasure2 = .text:0x80250F10; // type:function size:0x88 +isTreasure__9dAcItem_cF7ITEM_ID = .text:0x80250F10; // type:function size:0x88 AcItem__isItemHeart = .text:0x80250FA0; // type:function size:0x34 isSingleArrow = .text:0x80250FE0; // type:function size:0x8 isBundleOrArrows = .text:0x80250FF0; // type:function size:0x8 @@ -13513,7 +13513,7 @@ fn_80251180 = .text:0x80251180; // type:function size:0x44 AcItem__getEventName = .text:0x802511D0; // type:function size:0x6C fn_80251240 = .text:0x80251240; // type:function size:0x6C AcItem__getEventNamePtrForItemId = .text:0x802512B0; // type:function size:0x4C -TBox__getItemEventNamePtr = .text:0x80251300; // type:function size:0x4C +getItemGetEventName__9dAcItem_cFUsPPCc = .text:0x80251300; // type:function size:0x4C fn_80251350 = .text:0x80251350; // type:function size:0x54 AcItem__getPosition = .text:0x802513B0; // type:function size:0x24 fn_802513E0 = .text:0x802513E0; // type:function size:0xC @@ -13676,8 +13676,8 @@ fn_80252A80 = .text:0x80252A80; // type:function size:0xC fn_80252A90 = .text:0x80252A90; // type:function size:0xC fn_80252AA0 = .text:0x80252AA0; // type:function size:0xC itemGetBirdMaybe = .text:0x80252AB0; // type:function size:0x40 -itemGetEventStart = .text:0x80252AF0; // type:function size:0xD8 -AcItem__itemRecieved = .text:0x80252BD0; // type:function size:0x90 +itemGetEventStart__9dAcItem_cFP9dAcBase_c = .text:0x80252AF0; // type:function size:0xD8 +itemGetEventEnd__9dAcItem_cFP9dAcBase_c = .text:0x80252BD0; // type:function size:0x90 AcItem__getItemId2 = .text:0x80252C60; // type:function size:0x8 AcItem__setFinalDeterminedItemId = .text:0x80252C70; // type:function size:0x8 getItemInitStructForItem = .text:0x80252C80; // type:function size:0x5C @@ -14236,139 +14236,139 @@ initializeState__28sFStateID_c<13dAcObjFairy_c>CFR13dAcObjFairy_c = .text:0x8026 __sinit_\d_a_obj_fairy_cpp = .text:0x80267F40; // type:function size:0x56C scope:local __dt__28sFStateID_c<13dAcObjFairy_c>Fv = .text:0x802684B0; // type:function size:0x58 isSameName__28sFStateID_c<13dAcObjFairy_c>CFPCc = .text:0x80268510; // type:function size:0x88 -AcTbox__ctor = .text:0x802685A0; // type:function size:0x30 -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 = .text:0x80268660; // type:function size:0x20 -hasCollectedAllTears2 = .text:0x80268680; // type:function size:0x1C -fn_802686A0 = .text:0x802686A0; // type:function size:0x50 -fn_802686F0 = .text:0x802686F0; // type:function size:0x5C -AcTbox__ctorCont = .text:0x80268750; // type:function size:0x2EC -fn_80268A40 = .text:0x80268A40; // type:function size:0x98 -fn_80268AE0 = .text:0x80268AE0; // type:function size:0x58 -fn_80268B40 = .text:0x80268B40; // type:function size:0x6C -fn_80268BB0 = .text:0x80268BB0; // type:function size:0xA0 -fn_80268C50 = .text:0x80268C50; // type:function size:0xA4 -AcTbox__dtor = .text:0x80268D00; // type:function size:0x250 -AcTbox__initModels = .text:0x80268F50; // type:function size:0x54C -AcTbox__init = .text:0x802694A0; // type:function size:0xA00 -AcTbox__destroy = .text:0x80269EA0; // type:function size:0xB4 -AcTbox__update = .text:0x80269F60; // type:function size:0x690 -fn_8026A5F0 = .text:0x8026A5F0; // type:function size:0x10 -fn_8026A600 = .text:0x8026A600; // type:function size:0x10 -AcTbox__updateInEvent = .text:0x8026A610; // type:function size:0x8F0 -fn_8026AF00 = .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 -AcTbox__setItemId = .text:0x8026B330; // type:function size:0x8 -setDoObstructionCheckTrue = .text:0x8026B340; // type:function size:0xC -AcTbox__isActualVisibleBox = .text:0x8026B350; // type:function size:0xC -getRotX_shift9_0x1 = .text:0x8026B360; // type:function size:0xC -fn_8026B370 = .text:0x8026B370; // type:function size:0xC -fn_8026B380 = .text:0x8026B380; // type:function size:0x3C -fn_8026B3C0 = .text:0x8026B3C0; // type:function size:0x20 -AcTbox__stateDugOutEnter = .text:0x8026B3E0; // type:function size:0x11C -AcTbox__stateDugOutUpdate = .text:0x8026B500; // type:function size:0x3D8 -AcTbox__stateDugOutLeave = .text:0x8026B8E0; // type:function size:0x4 -AcTbox__stateWaitAppearEnter = .text:0x8026B8F0; // type:function size:0x7C -AcTbox__stateWaitAppearUpdate = .text:0x8026B970; // type:function size:0xB8 -AcTbox__stateWaitAppearLeave = .text:0x8026BA30; // type:function size:0x4 -AcTbox__stateDemoAppearEnter = .text:0x8026BA40; // type:function size:0xD0 -AcTbox__stateDemoAppearUpdate = .text:0x8026BB10; // type:function size:0x1F4 -AcTbox__stateDemoAppearLeave = .text:0x8026BD10; // type:function size:0x4 -AcTbox__stateWaitOpenEnter = .text:0x8026BD20; // type:function size:0x18C -AcTbox__stateWaitOpenUpdate = .text:0x8026BEB0; // type:function size:0x7C -AcTbox__stateWaitOpenLeave = .text:0x8026BF30; // type:function size:0x28 -AcTbox__stateGoddessWaitOffEnter = .text:0x8026BF60; // type:function size:0x84 -AcTbox__stateGoddessWaitOffUpdate = .text:0x8026BFF0; // type:function size:0x4 -AcTbox__stateGoddessWaitOffLeave = .text:0x8026C000; // type:function size:0x4 -AcTbox__stateGoddessWaitOnEnter = .text:0x8026C010; // type:function size:0x84 -AcTbox__stateGoddessWaitOnUpdate = .text:0x8026C0A0; // type:function size:0x60 -AcTbox__stateGoddessWaitOnLeave = .text:0x8026C100; // type:function size:0x3C -AcTbox__stateDeleteArchiveEnter = .text:0x8026C140; // type:function size:0x108 -AcTbox__stateDeleteArchiveUpdate = .text:0x8026C250; // type:function size:0xC8 -AcTbox__stateDeleteArchiveLeave = .text:0x8026C320; // type:function size:0x4 -AcTbox__stateLoadArchiveEnter = .text:0x8026C330; // type:function size:0x12C -AcTbox__stateLoadArchiveUpdate = .text:0x8026C460; // type:function size:0x58 -AcTbox__stateLoadArchiveLeave = .text:0x8026C4C0; // type:function size:0x4 -AcTbox__stateOpenEnter = .text:0x8026C4D0; // type:function size:0x258 -AcTbox__stateOpenUpdate = .text:0x8026C730; // type:function size:0x11C -AcTbox__stateOpenLeave = .text:0x8026C850; // type:function size:0x4 -AcTbox__statePresentItemEnter = .text:0x8026C860; // type:function size:0x98 -AcTbox__statePresentItemUpdate = .text:0x8026C900; // type:function size:0x19C -AcTbox__statePresentItemLeave = .text:0x8026CAA0; // type:function size:0x4 -AcTbox__stateCloseEnter = .text:0x8026CAB0; // type:function size:0xA8 -AcTbox__stateCloseUpdate = .text:0x8026CB60; // type:function size:0x26C -AcTbox__stateCloseLeave = .text:0x8026CDD0; // type:function size:0x4 -AcTbox__stateWaitEnter = .text:0x8026CDE0; // type:function size:0x17C -AcTbox__stateWaitUpdate = .text:0x8026CF60; // type:function size:0x9C -AcTbox__stateWaitLeave = .text:0x8026D000; // type:function size:0x4 -AcTbox__stateGoddessWaitEnter = .text:0x8026D010; // type:function size:0x70 -AcTbox__stateGoddessWaitUpdate = .text:0x8026D080; // type:function size:0x74 -AcTbox__stateGoddessWaitLeave = .text:0x8026D100; // type:function size:0x4 -fn_8026D110 = .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 -AcTbox__doInteraction = .text:0x8026D150; // type:function size:0x98 -fn_8026D1F0 = .text:0x8026D1F0; // type:function size:0xDC -fn_8026D2D0 = .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 -fn_8026D370 = .text:0x8026D370; // type:function size:0x4C -fn_8026D3C0 = .text:0x8026D3C0; // type:function size:0xD4 -AcTbox__setChestflag = .text:0x8026D4A0; // type:function size:0x10 -AcTbox__setTboxFlag = .text:0x8026D4B0; // type:function size:0x18 -checkTBoxFlagMaybe = .text:0x8026D4D0; // type:function size:0x4C -fn_8026D520 = .text:0x8026D520; // type:function size:0x18 -fn_8026D540 = .text:0x8026D540; // type:function size:0x14 -fn_8026D560 = .text:0x8026D560; // type:function size:0x94 -fn_8026D600 = .text:0x8026D600; // type:function size:0x68 -fn_8026D670 = .text:0x8026D670; // type:function size:0x8 -fn_8026D680 = .text:0x8026D680; // type:function size:0x10 -ActorObjectBase__setActorCollision = .text:0x8026D690; // type:function size:0xB8 -AcTbox__initializeDowsingTarget = .text:0x8026D750; // type:function size:0x14 -AcTbox__isItemRupee = .text:0x8026D770; // type:function size:0x8 -AcTbox__initDowsingTarget = .text:0x8026D780; // type:function size:0x50 -AcTbox__initDowsingTargetCube = .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 -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_8026E740 = .text:0x8026E740; // type:function size:0x60 -fn_8026E7A0 = .text:0x8026E7A0; // type:function size:0xC -fn_8026E7B0 = .text:0x8026E7B0; // type:function size:0x1C -fn_8026E7D0 = .text:0x8026E7D0; // type:function size:0x1C -fn_8026E7F0 = .text:0x8026E7F0; // type:function size:0x1C -fn_8026E810 = .text:0x8026E810; // type:function size:0x10 -fn_8026E820 = .text:0x8026E820; // type:function size:0x10 -fn_8026E830 = .text:0x8026E830; // type:function size:0x10 -fn_8026E840 = .text:0x8026E840; // type:function size:0x10 -fn_8026E850 = .text:0x8026E850; // type:function size:0x10 -fn_8026E860 = .text:0x8026E860; // type:function size:0x10 -fn_8026E870 = .text:0x8026E870; // type:function size:0x30 -fn_8026E8A0 = .text:0x8026E8A0; // type:function size:0x30 -fn_8026E8D0 = .text:0x8026E8D0; // type:function size:0x30 -AcTbox__initStatesAndThings = .text:0x8026E900; // type:function size:0xA7C -AcTbox__dtor2 = .text:0x8026F380; // type:function size:0x58 -fn_8026F3E0 = .text:0x8026F3E0; // type:function size:0x88 -fn_8026F470 = .text:0x8026F470; // type:function size:0x8 -fn_8026F480 = .text:0x8026F480; // type:function size:0x8 +dAcTbox_c_classInit__Fv = .text:0x802685A0; // type:function size:0x30 +tryGetDowsingTargetOffset__9dAcTbox_cFiR7mVec3_c = .text:0x802685D0; // type:function size:0x68 +getDowsingTargetOffset__9dAcTbox_cFiR7mVec3_c = .text:0x80268640; // type:function size:0x4 +getSomeRate__9dAcTbox_cFv = .text:0x80268650; // type:function size:0x8 +isValidGroupIndex__9dAcTbox_cFi = .text:0x80268660; // type:function size:0x20 +hasCollectedAllTears__9dAcTbox_cFv = .text:0x80268680; // type:function size:0x1C +getGroundHeight__9dAcTbox_cFPfRC7mVec3_c = .text:0x802686A0; // type:function size:0x50 +isBelowGroundAtPos__9dAcTbox_cFfRC7mVec3_c = .text:0x802686F0; // type:function size:0x5C +__ct__9dAcTbox_cFv = .text:0x80268750; // type:function size:0x2EC +__dt__15dCcD_Linked_UnkFv = .text:0x80268A40; // type:function size:0x98 +__dt__21sFState_c<9dAcTbox_c>Fv = .text:0x80268AE0; // type:function size:0x58 +__dt__24sFStateFct_c<9dAcTbox_c>Fv = .text:0x80268B40; // type:function size:0x6C +__dt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x80268BB0; // type:function size:0xA0 +__dt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c>Fv = .text:0x80268C50; // type:function size:0xA4 +__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 +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 +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 +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__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 +initializeState_WaitAppear__9dAcTbox_cFv = .text:0x8026B8F0; // type:function size:0x7C +executeState_WaitAppear__9dAcTbox_cFv = .text:0x8026B970; // type:function size:0xB8 +finalizeState_WaitAppear__9dAcTbox_cFv = .text:0x8026BA30; // type:function size:0x4 +initializeState_DemoAppear__9dAcTbox_cFv = .text:0x8026BA40; // type:function size:0xD0 +executeState_DemoAppear__9dAcTbox_cFv = .text:0x8026BB10; // type:function size:0x1F4 +finalizeState_DemoAppear__9dAcTbox_cFv = .text:0x8026BD10; // type:function size:0x4 +initializeState_WaitOpen__9dAcTbox_cFv = .text:0x8026BD20; // type:function size:0x18C +executeState_WaitOpen__9dAcTbox_cFv = .text:0x8026BEB0; // type:function size:0x7C +finalizeState_WaitOpen__9dAcTbox_cFv = .text:0x8026BF30; // type:function size:0x28 +initializeState_GoddessWaitOff__9dAcTbox_cFv = .text:0x8026BF60; // type:function size:0x84 +executeState_GoddessWaitOff__9dAcTbox_cFv = .text:0x8026BFF0; // type:function size:0x4 +finalizeState_GoddessWaitOff__9dAcTbox_cFv = .text:0x8026C000; // type:function size:0x4 +initializeState_GoddessWaitOn__9dAcTbox_cFv = .text:0x8026C010; // type:function size:0x84 +executeState_GoddessWaitOn__9dAcTbox_cFv = .text:0x8026C0A0; // type:function size:0x60 +finalizeState_GoddessWaitOn__9dAcTbox_cFv = .text:0x8026C100; // type:function size:0x3C +initializeState_DeleteArchive__9dAcTbox_cFv = .text:0x8026C140; // type:function size:0x108 +executeState_DeleteArchive__9dAcTbox_cFv = .text:0x8026C250; // type:function size:0xC8 +finalizeState_DeleteArchive__9dAcTbox_cFv = .text:0x8026C320; // type:function size:0x4 +initializeState_LoadArchive__9dAcTbox_cFv = .text:0x8026C330; // type:function size:0x12C +executeState_LoadArchive__9dAcTbox_cFv = .text:0x8026C460; // type:function size:0x58 +finalizeState_LoadArchive__9dAcTbox_cFv = .text:0x8026C4C0; // type:function size:0x4 +initializeState_Open__9dAcTbox_cFv = .text:0x8026C4D0; // type:function size:0x258 +executeState_Open__9dAcTbox_cFv = .text:0x8026C730; // type:function size:0x11C +finalizeState_Open__9dAcTbox_cFv = .text:0x8026C850; // type:function size:0x4 +initializeState_PresentItem__9dAcTbox_cFv = .text:0x8026C860; // type:function size:0x98 +executeState_PresentItem__9dAcTbox_cFv = .text:0x8026C900; // type:function size:0x19C +finalizeState_PresentItem__9dAcTbox_cFv = .text:0x8026CAA0; // type:function size:0x4 +initializeState_Close__9dAcTbox_cFv = .text:0x8026CAB0; // type:function size:0xA8 +executeState_Close__9dAcTbox_cFv = .text:0x8026CB60; // type:function size:0x26C +finalizeState_Close__9dAcTbox_cFv = .text:0x8026CDD0; // type:function size:0x4 +initializeState_Wait__9dAcTbox_cFv = .text:0x8026CDE0; // type:function size:0x17C +executeState_Wait__9dAcTbox_cFv = .text:0x8026CF60; // type:function size:0x9C +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 +getDowsingTargetOffset__9dAcTbox_cCFP7mVec3_c = .text:0x8026D110; // type:function size:0x8 +fn_8026D120__9dAcTbox_cCFv = .text:0x8026D120; // type:function size:0x8 +fn_8026D130__9dAcTbox_cFv = .text:0x8026D130; // type:function size:0x10 +fn_8026D140__9dAcTbox_cFv = .text:0x8026D140; // type:function size:0x10 +doInteraction__9dAcTbox_cFl = .text:0x8026D150; // type:function size:0x98 +registerInEvent__9dAcTbox_cFv = .text:0x8026D1F0; // type:function size:0xDC +unkVirtFunc_0x6C__9dAcTbox_cFv = .text:0x8026D2D0; // type:function size:0x68 +checkShouldClose__9dAcTbox_cFv = .text:0x8026D340; // type:function size:0xC +setShouldCloseFlag__9dAcTbox_cFv = .text:0x8026D350; // type:function size:0xC +unsetShouldCloseFlag__9dAcTbox_cFv = .text:0x8026D360; // type:function size:0xC +fn_8026D370__9dAcTbox_cFv = .text:0x8026D370; // type:function size:0x4C +fn_8026D3C0__9dAcTbox_cFv = .text:0x8026D3C0; // type:function size:0xD4 +setChestFlag__9dAcTbox_cFv = .text:0x8026D4A0; // type:function size:0x10 +setTboxFlag__9dAcTbox_cFv = .text:0x8026D4B0; // type:function size:0x18 +checkTboxFlag__9dAcTbox_cCFv = .text:0x8026D4D0; // type:function size:0x4C +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 +syncScaleToMdl__9dAcTbox_cFPQ23m3d9scnLeaf_c = .text:0x8026D680; // type:function size:0x10 +initBgW__9dAcTbox_cFR4dBgWPCcPCc = .text:0x8026D690; // type:function size:0xB8 +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__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 +spawnAppearEffect__9dAcTbox_cFv = .text:0x8026D950; // type:function size:0x28 +checkIsClear__9dAcTbox_cCFv = .text:0x8026D980; // type:function size:0x140 +fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 +fn_8026DAD0__9dAcTbox_cCFPC7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 +getCylParams__9dAcTbox_cCFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C +getCCBounds__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC +getInteractionTargetDef__9dAcTbox_cCFv = .text:0x8026E050; // type:function size:0x40 +checkForLinkBonk__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 +execute__21sFState_c<9dAcTbox_c>Fv = .text:0x8026E7D0; // type:function size:0x1C +finalize__21sFState_c<9dAcTbox_c>Fv = .text:0x8026E7F0; // type:function size:0x1C +initializeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026E810; // type:function size:0x10 +finalizeState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026E820; // type:function size:0x10 +refreshState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8026E830; // type:function size:0x10 +getState__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026E840; // type:function size:0x10 +getNewStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026E850; // type:function size:0x10 +getOldStateID__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8026E860; // type:function size:0x10 +finalizeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E870; // type:function size:0x30 +executeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E8A0; // type:function size:0x30 +initializeState__23sFStateID_c<9dAcTbox_c>CFR9dAcTbox_c = .text:0x8026E8D0; // type:function size:0x30 +__sinit_\d_a_obj_tbox_cpp = .text:0x8026E900; // type:function size:0xA7C scope:local +__dt__23sFStateID_c<9dAcTbox_c>Fv = .text:0x8026F380; // type:function size:0x58 +isSameName__23sFStateID_c<9dAcTbox_c>CFPCc = .text:0x8026F3E0; // type:function size:0x88 +@316@__dt__15dCcD_Linked_UnkFv = .text:0x8026F470; // type:function size:0x8 +@272@__dt__15dCcD_Linked_UnkFv = .text:0x8026F480; // type:function size:0x8 AcTimeArea__ctor = .text:0x8026F490; // type:function size:0x1A8 fn_8026F640 = .text:0x8026F640; // type:function size:0x58 fn_8026F6A0 = .text:0x8026F6A0; // type:function size:0x6C @@ -17284,7 +17284,7 @@ insertAfter__9cListMg_cFP9cListNd_cP9cListNd_c = .text:0x802E08C0; // type:funct remove__9cListMg_cFP9cListNd_c = .text:0x802E0900; // type:function size:0xAC append__9cListMg_cFP9cListNd_c = .text:0x802E09B0; // type:function size:0x30 prepend__9cListMg_cFP9cListNd_c = .text:0x802E09E0; // type:function size:0x30 -ListLink__clear = .text:0x802E0A10; // type:function size:0x40 +clear__9cListMg_cFv = .text:0x802E0A10; // type:function size:0x40 cM__rad2s = .text:0x802E0A50; // type:function size:0x5C cM__U_GetAtanTable = .text:0x802E0AB0; // type:function size:0x34 atan2s__2cMFff = .text:0x802E0AF0; // type:function size:0x1BC @@ -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 @@ -30059,8 +30059,8 @@ lbl_80503248 = .data:0x80503248; // type:object size:0x30 lbl_80503278 = .data:0x80503278; // type:object size:0x9C lbl_80503314 = .data:0x80503314; // type:object size:0x6C __vt__7dBase_c = .data:0x80503380; // type:object size:0x4C -lbl_805033D0 = .data:0x805033D0; // type:object size:0x10 -lbl_805033E0 = .data:0x805033E0; // type:object size:0x10 +__vt__16ActorCarryStruct = .data:0x805033D0; // type:object size:0xC +__vt__19dColliderLinkedList = .data:0x805033E0; // type:object size:0xC __vt__Q24dDvd8loader_c = .data:0x805033F0; // type:object size:0x10 lbl_80503400 = .data:0x80503400; // type:object size:0x40 lbl_80503440 = .data:0x80503440; // type:object size:0x6DF8 @@ -34560,13 +34560,13 @@ lbl_805353A4 = .data:0x805353A4; // type:object size:0xE4 lbl_80535488 = .data:0x80535488; // type:object size:0xC lbl_80535494 = .data:0x80535494; // type:object size:0x14 lbl_805354A8 = .data:0x805354A8; // type:object size:0x18 -AcTbox__vtable = .data:0x805354C0; // type:object size:0x80 -lbl_80535540 = .data:0x80535540; // type:object size:0x30 -lbl_80535570 = .data:0x80535570; // type:object size:0x30 -lbl_805355A0 = .data:0x805355A0; // type:object size:0x18 -lbl_805355B8 = .data:0x805355B8; // type:object size:0x18 -lbl_805355D0 = .data:0x805355D0; // type:object size:0x410 -lbl_805359E0 = .data:0x805359E0; // type:object size:0x38 +__vt__9dAcTbox_c = .data:0x805354C0; // type:object size:0x80 +__vt__47sFStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c> = .data:0x80535540; // type:object size:0x30 +__vt__77sStateMgr_c<9dAcTbox_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80535570; // type:object size:0x30 +__vt__24sFStateFct_c<9dAcTbox_c> = .data:0x805355A0; // type:object size:0x14 +__vt__21sFState_c<9dAcTbox_c> = .data:0x805355B8; // type:object size:0x18 +__vt__15dCcD_Linked_Unk = .data:0x805355D0; // type:object size:0x7C +__vt__23sFStateID_c<9dAcTbox_c> = .data:0x805359E0; // type:object size:0x34 g_profile_TIME_AREA = .data:0x80535A18; // type:object size:0x10 lbl_80535A28 = .data:0x80535A28; // type:object size:0x68 lbl_80535A90 = .data:0x80535A90; // type:object size:0x20 @@ -40176,7 +40176,7 @@ lbl_80575698 = .sbss:0x80575698; // type:object size:0x4 data:4byte lbl_8057569C = .sbss:0x8057569C; // type:object size:0x4 data:4byte lbl_805756A0 = .sbss:0x805756A0; // type:object size:0x4 data:4byte lbl_805756A4 = .sbss:0x805756A4; // type:object size:0x4 data:4byte -GODDESS_CHESTS_OPENED_COUNTER = .sbss:0x805756A8; // type:object size:0x8 data:4byte +sInstance__19GoddessChestCounter = .sbss:0x805756A8; // type:object size:0x8 data:4byte BOOT_PTR = .sbss:0x805756B0; // type:object size:0x4 data:4byte lbl_805756B4 = .sbss:0x805756B4; // type:object size:0x4 data:4byte TITLE_SCREEN_CHANGE = .sbss:0x805756B8; // type:object size:0x4 data:4byte @@ -40361,20 +40361,20 @@ lbl_805758F4 = .sbss:0x805758F4; // type:object size:0x1 data:byte 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 -TBOX_ACTOR_LIST = .sbss:0x80575910; // type:object size:0x8 data:4byte -CURRENT_OBTAINING_ITEM_OARC_NAME = .sbss:0x80575918; // type:object size:0x4 data:4byte -lbl_8057591C = .sbss:0x8057591C; // type:object size:0x1 data:byte -lbl_8057591D = .sbss:0x8057591D; // type:object size:0x1 data:byte -lbl_8057591E = .sbss:0x8057591E; // type:object size:0x1 data:byte -lbl_8057591F = .sbss:0x8057591F; // type:object size:0x1 data:byte -lbl_80575920 = .sbss:0x80575920; // type:object size:0x1 data:byte -lbl_80575921 = .sbss:0x80575921; // type:object size:0x1 data:byte -lbl_80575922 = .sbss:0x80575922; // type:object size:0x1 data:byte -lbl_80575923 = .sbss:0x80575923; // type:object size:0x1 data:byte -lbl_80575924 = .sbss:0x80575924; // type:object size:0x1 data:byte -lbl_80575925 = .sbss:0x80575925; // type:object size:0x1 data:byte -lbl_80575926 = .sbss:0x80575926; // type:object size:0x1 data:byte -lbl_80575927 = .sbss:0x80575927; // type:object size:0x1 data:byte +sTboxActorList__9dAcTbox_c = .sbss:0x80575910; // type:object size:0x8 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 +@GUARD@create__9dAcTbox_cFv@bbUp@4 = .sbss:0x8057591F; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbLo@5 = .sbss:0x80575920; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbUp@6 = .sbss:0x80575921; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbLo@7 = .sbss:0x80575922; // type:object size:0x1 data:byte +@GUARD@create__9dAcTbox_cFv@bbUp@8 = .sbss:0x80575923; // type:object size:0x1 data:byte +@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 +@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 @@ -48395,7 +48395,7 @@ lbl_8058F1B8 = .bss:0x8058F1B8; // type:object size:0x10 data:float lbl_8058F1C8 = .bss:0x8058F1C8; // type:object size:0x28 data:float lbl_8058F1F0 = .bss:0x8058F1F0; // type:object size:0x20 data:byte lbl_8058F210 = .bss:0x8058F210; // type:object size:0x10 -BLUR_AND_PALETTE_MGR = .bss:0x8058F220; // type:object size:0x5D70 +sInstance__21BlurAndPaletteManager = .bss:0x8058F220; // type:object size:0x5D70 lbl_80594F90 = .bss:0x80594F90; // type:object size:0x10 data:4byte lbl_80594FA0 = .bss:0x80594FA0; // type:object size:0x18 data:4byte lbl_80594FB8 = .bss:0x80594FB8; // type:object size:0x1C @@ -49178,15 +49178,23 @@ StateID_CatchDemo__13dAcObjFairy_c = .bss:0x805B4F68; // type:object size:0x30 d lbl_805B4FA8 = .bss:0x805B4FA8; // type:object size:0x30 data:float lbl_805B4FD8 = .bss:0x805B4FD8; // type:object size:0xC data:float lbl_805B4FE4 = .bss:0x805B4FE4; // type:object size:0xC data:float -lbl_805B4FF0 = .bss:0x805B4FF0; // type:object size:0xE8 data:float -AcTbox__STATE_WAIT_OPEN = .bss:0x805B50D8; // type:object size:0x80 data:4byte -AcTbox__STATE_GODDESS_WAIT_ON = .bss:0x805B5158; // type:object size:0x80 data:4byte -AcTbox__STATE_LOAD_ARCHIVE = .bss:0x805B51D8; // type:object size:0x40 data:4byte -AcTbox__STATE_OPEN = .bss:0x805B5218; // type:object size:0x40 data:4byte -AcTbox__StateID_PresentItem = .bss:0x805B5258; // type:object size:0xF0 data:4byte +lbl_805B4FF0 = .bss:0x805B4FF0; // type:object size:0x18 data:float +StateID_DugOut__9dAcTbox_c = .bss:0x805B5018; // type:object size:0x30 data:4byte +StateID_WaitAppear__9dAcTbox_c = .bss:0x805B5058; // type:object size:0x30 data:4byte +StateID_DemoAppear__9dAcTbox_c = .bss:0x805B5098; // type:object size:0x30 data:4byte +StateID_WaitOpen__9dAcTbox_c = .bss:0x805B50D8; // type:object size:0x30 data:4byte +StateID_GoddessWaitOff__9dAcTbox_c = .bss:0x805B5118; // type:object size:0x30 data:4byte +StateID_GoddessWaitOn__9dAcTbox_c = .bss:0x805B5158; // type:object size:0x30 data:4byte +StateID_DeleteArchive__9dAcTbox_c = .bss:0x805B5198; // type:object size:0x30 data:4byte +StateID_LoadArchive__9dAcTbox_c = .bss:0x805B51D8; // type:object size:0x30 data:4byte +StateID_Open__9dAcTbox_c = .bss:0x805B5218; // type:object size:0x30 data:4byte +StateID_PresentItem__9dAcTbox_c = .bss:0x805B5258; // type:object size:0x30 data:4byte +StateID_Close__9dAcTbox_c = .bss:0x805B5298; // type:object size:0x30 data:4byte +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/configure.py b/configure.py index 72324e32..48bd489a 100644 --- a/configure.py +++ b/configure.py @@ -324,6 +324,8 @@ config.libs = [ Object(Matching, "d/flag/flag_managers.cpp"), Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "d/d_base.cpp"), + Object(NonMatching, "d/d_carry.cpp"), + Object(Matching, "d/d_cc.cpp"), Object(Matching, "d/d_dvd.cpp"), Object(NonMatching, "d/d_dvd_unk.cpp"), Object(NonMatching, "d/d_dylink.cpp"), @@ -484,6 +486,8 @@ config.libs = [ "host": False, "objects": [ Object(Matching, "c/c_list.cpp"), + Object(NonMatching, "c/c_math.cpp"), + Object(NonMatching, "c/c_rand.cpp"), Object(Matching, "c/c_tree.cpp"), ], }, diff --git a/include/c/c_list.h b/include/c/c_list.h index 8fdba626..2c45d27d 100644 --- a/include/c/c_list.h +++ b/include/c/c_list.h @@ -57,6 +57,8 @@ public: */ void prepend(cListNd_c *node); + void clear(); + cListNd_c *getFirst() const { return mpFirst; } diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 946d0ca4..90afd1dc 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -9,6 +9,7 @@ #include "toBeSorted/tlist.h" class dAcBase_c; +struct cBgS_PolyInfo; struct SoundSource { // TODO @@ -255,7 +256,7 @@ public: /* 8002dd50 */ void FUN_8002dd50(); /* 8002dd90 */ void FUN_8002dd90(); /* 8002ddd0 */ void FUN_8002ddd0(); - /* 8002de30 */ void FUN_8002de30(); + /* 8002de30 */ void FUN_8002de30(cBgS_PolyInfo &p); public: /* 80571920 */ static u32 s_Create_RoomId; diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 468f0419..1f0b7691 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -55,6 +55,14 @@ 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); + + static bool getItemGetEventName(u16 item, const char **outName); + static void itemGetEventStart(dAcBase_c *); + static void itemGetEventEnd(dAcBase_c *); + private: /* 0x334 */ UNKTYPE *mpMdl; // Model has its own handling system /* 0x338 */ dShadowCircle_c mShdw; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index db108962..9aebf254 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -55,6 +55,9 @@ public: virtual ~dAcPy_c(); void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD); + void setPosYRot(const mVec3_c &pos, mAng rot, UNKWORD, UNKWORD, UNKWORD); + // argument is always false in existing code, true doesn't seem to make a difference + void bonk(bool unk = false); /* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD); /* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD); @@ -114,7 +117,7 @@ public: /* vt 0x15C */ virtual void vt_0x15C(); /* vt 0x160 */ virtual void vt_0x160(); /* vt 0x164 */ virtual void vt_0x164(); - /* vt 0x168 */ virtual void getCurrentAnimFrame(); + /* vt 0x168 */ virtual f32 getCurrentAnimFrame() const; /* vt 0x16C */ virtual void getFloatIfStruggling(); /* vt 0x170 */ virtual void isSwimming(); /* vt 0x174 */ virtual void isGustBellowsBeingBlown(); diff --git a/include/d/a/obj/d_a_obj_base.h b/include/d/a/obj/d_a_obj_base.h index 8dd4372e..78d72533 100644 --- a/include/d/a/obj/d_a_obj_base.h +++ b/include/d/a/obj/d_a_obj_base.h @@ -18,7 +18,7 @@ class dBgS_Acch; // Size: 0xA8 struct ActorCarryStruct { - /* 0x00 */ fLiNdBa_c actorLink; + /* 0x00 */ dAcRefBase_c actorLink; /* 0x0C */ fLiNdBa_c *carriedActor; /* 0x10 */ u32 carryFlags; /* 0x14 */ int carryType; @@ -32,7 +32,10 @@ struct ActorCarryStruct { /* 0x90 */ f32 field_0x90; /* 0x94 */ f32 field_0x94; /* 0x98 */ f32 field_0x98; - /* 0x9C */ void *dtor; // ??? + + ActorCarryStruct(); + /* vt 0x9C */ + virtual ~ActorCarryStruct(); /* 0xA0 */ u32 field_0xA0; /* 0xA4 */ u32 field_0xA4; @@ -43,6 +46,8 @@ struct ActorCarryStruct { void fn_80050EA0(dAcObjBase_c *); void fn_800511E0(dAcObjBase_c *); + void fn_80051190(dAcObjBase_c *); + void fn_80050EB0(dAcObjBase_c *); bool testCarryFlag(u32 flag) { return (carryFlags & flag) != 0; @@ -215,7 +220,7 @@ public: if (!result) \ return result; \ } while (0) -// Use this in actors' createHeap functions +// Use this in actors' create functions #define CREATE_ALLOCATOR(className) \ do { \ if (!initAllocatorWork1Heap(-1, #className "::m_allocator", 0x20)) { \ diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h new file mode 100644 index 00000000..c168d13c --- /dev/null +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -0,0 +1,212 @@ +#ifndef D_A_OBJ_TBOX_H +#define D_A_OBJ_TBOX_H + +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/col/bg/d_bg_w.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_cc.h" +#include "d/d_shadow.h" +#include "m/m3d/m_anmchr.h" +#include "m/m3d/m_anmmatclr.h" +#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" + +class dAcTbox_c : public dAcObjBase_c { +public: + enum TboxVariant_e { + NORMAL, + SMALL, + BOSS, + GODDESS, + }; + + dAcTbox_c(); + virtual ~dAcTbox_c(); + + virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int actorExecuteInEvent() override; + virtual int draw() override; + + virtual void registerInEvent() override; + virtual void unkVirtFunc_0x6C() override; + virtual void doInteraction(s32) override; + + virtual void *getObjectListEntry() override; + + STATE_FUNC_DECLARE(dAcTbox_c, DugOut); + STATE_FUNC_DECLARE(dAcTbox_c, WaitAppear); + STATE_FUNC_DECLARE(dAcTbox_c, DemoAppear); + STATE_FUNC_DECLARE(dAcTbox_c, WaitOpen); + STATE_FUNC_DECLARE(dAcTbox_c, GoddessWaitOff); + STATE_FUNC_DECLARE(dAcTbox_c, GoddessWaitOn); + STATE_FUNC_DECLARE(dAcTbox_c, DeleteArchive); + STATE_FUNC_DECLARE(dAcTbox_c, LoadArchive); + STATE_FUNC_DECLARE(dAcTbox_c, Open); + STATE_FUNC_DECLARE(dAcTbox_c, PresentItem); + STATE_FUNC_DECLARE(dAcTbox_c, Close); + STATE_FUNC_DECLARE(dAcTbox_c, Wait); + STATE_FUNC_DECLARE(dAcTbox_c, GoddessWait); + +private: + static f32 getSomeRate(); + bool initBgW(dBgW &bg, const char *arcName, const char *fileName); + bool isNotSmall() const; + void setItemId(u16 item); + void setChestFlag(); + void setDoObstructionCheck(); + int isActualVisibleBox() const; + void fn_8026B380(mVec3_c &outResult) const; + const mVec3_c &fn_8026B3C0() const; + + bool noObstructionCheck() const; + int fn_8026B370() const; + bool fn_8026D670() const; + bool getSomeCounter(u32 *outIndex) const; + 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(); + + void registerRupeeOrTreasureDowsing(); + void registerKeyPieceDowsing(); + void unregisterDowsing(); + void noRegisterDowsing(); + void noUnregisterDowsing(); + + bool checkForLinkBonk(); + void fn_8026E630(); + bool fn_8026D540(); + void fn_8026D3C0(); + void syncScaleToMdl(m3d::scnLeaf_c *lf); + void getCCBounds(mVec3_c *out1, mVec3_c *out2) const; + void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3) const; + void fn_8026DAD0(const mVec3_c *src, mVec3_c *dest) const; + void fn_8026DAC0(mAng &ang); + + static bool hasCollectedAllTears(); + static bool isValidVariant(int variant); + static bool tryGetDowsingTargetOffset(int variant, mVec3_c &out); + static void getDowsingTargetOffset(int variant, mVec3_c &out); + static bool isValidGroupIndex(int idx); + static bool getGroundHeight(f32 *height, const mVec3_c &pos); + static bool isBelowGroundAtPos(f32 height, const mVec3_c &pos); + + void setActionState(); + + void setFlags(u32 flags); + + bool fn_8026D120() const; + void fn_8026D130(); + void fn_8026D140(); + void spawnAppearEffect(); + void fn_8026D370(); + + bool checkShouldClose(); + void setShouldCloseFlag(); + void unsetShouldCloseFlag(); + void setTboxFlag(); + + bool checkIsClear() const; + const InteractionTargetDef &getInteractionTargetDef() const; + + /* 0x0330 */ m3d::mdlAnmChr mMdl1; + /* 0x0398 */ m3d::smdl_c mOpenFxMdl; + /* 0x03B4 */ m3d::anmMatClr_c mAnmMatClr1; + /* 0x03E0 */ m3d::anmMatClr_c mAnmMatClr2; + /* 0x040C */ m3d::anmChr_c mAnmChr; + /* 0x0444 */ m3d::anmTexSrt_c mAnmTexSrt1; + /* 0x0470 */ m3d::anmTexSrt_c mAnmGoddessTexSrt; + /* 0x049C */ m3d::anmTexPat_c mAnmGoddessPat; + /* 0x04C8 */ dScnCallback_c mScnCallback; + /* 0x04D4 */ dShadowCircle_c mShadowCircle; + + // Could be part of an aggregate structure + mVec3_c field_0x4DC; + nw4r::ut::Color field_0x4E8; + f32 field_0x4EC; + s32 field_0x4F0; + s32 field_0x4F4; + + /* 0x04F8 */ dBgW mBgWs[2]; + /* 0x0918 */ dCcD_Linked_Unk mCcD1; + /* 0x0B30 */ dCcD_Linked_Unk mCcD2; + /* 0x0D48 */ dColliderLinkedList field_0x0D48; + /* 0x0D54 */ dCcD_Unk mCcD3; + /* 0x0F5C */ dCcD_Cyl mCcD4; + /* 0x10AC */ STATE_MGR_DECLARE(dAcTbox_c); + /* 0x10E8 */ fLiNdBa_c mTboxListNode; + /* 0x10F4 */ ActorEventRelated mEvent; + /* 0x1144 */ dAcRef_c mItemRef; + /* 0x1150 */ DowsingTarget mDowsingTarget; + /* 0x1170 */ DowsingTarget mGoddessDowsingTarget; + /* 0x1190 */ void (dAcTbox_c::*mRegisterDowsingTarget)(); + /* 0x119C */ void (dAcTbox_c::*mUnregisterDowsingTarget)(); + + /* 0x11A8 */ u8 field_0x11A8[0x11C0 - 0x11A8]; + + /* 0x11C0 */ mVec3_c field_0x11C0; + /* 0x11CC */ mVec3_c field_0x11CC; + + /* 0x11D8 */ mVec3_c field_0x11D8; + + /* 0x11E4 */ u8 field_0x11E4[0x11E8 - 0x11E4]; + /* 0x11E8 */ f32 field_0x11E8; + + /* 0x11EC */ f32 field_0x11EC; + /* 0x11F0 */ UNKWORD field_0x11F0; + /* 0x11F4 */ UNKWORD field_0x11F4; + + /* 0x11F8 */ UNKWORD field_0x11F8; + + /* 0x11FC */ UNKWORD field_0x11FC; + + /* 0x1200 */ u16 mItemId; + + /* 0x1202 */ u16 mItemModelIdx; + + /* 0x1204 */ bool mHasBeenOpened; + /* 0x1205 */ u8 mSpawnSceneFlag; + /* 0x1206 */ u8 mSetSceneFlag; // set when? + + /* 0x1207 */ u8 field_0x1207; + + /* 0x1208 */ u8 field_0x1208; + /* 0x1209 */ u8 mVariant; + /* 0x120A */ u8 field_0x120A; + + /* 0x120B */ u8 field_0x120B; + /* 0x120C */ u8 field_0x120C; + + /* 0x120D */ u8 field_0x120D; + + /* 0x120E */ u8 field_0x120E; + + /* 0x120F */ bool field_0x120F; + /* 0x1210 */ bool field_0x1210; + /* 0x1211 */ bool mDoObstructedCheck; + + static const cCcD_SrcGObj sColSrc; + static fLiMgBa_c sTboxActorList; +}; + +#endif diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 49791e31..b9d9daa4 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -883,6 +883,12 @@ public: u32 ChkAtNoGaurd() const { return mAt.MskSPrm(0x200000); } + void SetAt_0x40000000() { + mAt.OnSPrm(0x40000000); + } + u32 ChkAt_0x40000000() { + return mAt.MskSPrm(0x40000000); + } // Tg @@ -908,6 +914,12 @@ public: void SetTgInfo_0x2(u16 val) { mTg.SetInfo_0x2(val); } + void SetTg_0x40000000() { + mTg.OnSPrm(0x40000000); + } + u32 ChkTg_0x40000000() { + return mTg.MskSPrm(0x40000000); + } // Co @@ -929,6 +941,12 @@ public: void SetCo_0x400() { mCo.OnSPrm(0x400); } + void SetCo_0x40000000() { + mCo.OnSPrm(0x40000000); + } + u32 ChkCo_0x40000000() { + return mCo.MskSPrm(0x40000000); + } /** * SET HIT 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/d/d_cc.h b/include/d/d_cc.h new file mode 100644 index 00000000..c5349190 --- /dev/null +++ b/include/d/d_cc.h @@ -0,0 +1,101 @@ +#ifndef D_CC_H +#define D_CC_H + +#include "c/c_list.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" + +class LinkedColliderNode : public cListNd_c { +public: + LinkedColliderNode(cCcD_Obj *obj) : mpList(nullptr), mpCcDObj(obj) {} + void remove() { + if (mpList != nullptr) { + mpList->remove(this); + mpList = nullptr; + } + } + /* 0x08 */ cCcD_Obj *mpCcDObj; + /* 0x0C */ cListMg_c *mpList; +}; + +class dCcD_Linked_Unk : public dCcD_Unk { +public: + dCcD_Linked_Unk() : mNode(this) {} + virtual ~dCcD_Linked_Unk() { + mNode.remove(); + } + /* 0x210 */ LinkedColliderNode mNode; +}; + +class dCcD_Linked_Cyl : public dCcD_Cyl { +public: + dCcD_Linked_Cyl() : mNode(this) {} + virtual ~dCcD_Linked_Cyl() { + mNode.remove(); + } + /* 0x150 */ LinkedColliderNode mNode; +}; + +class dCcD_Linked_Sph : public dCcD_Sph { +public: + dCcD_Linked_Sph() : mNode(this) {} + virtual ~dCcD_Linked_Sph() { + mNode.remove(); + } + /* 0x150 */ LinkedColliderNode mNode; +}; + +class dCcD_Linked_Cps : public dCcD_Cps { +public: + dCcD_Linked_Cps() : mNode(this) {} + virtual ~dCcD_Linked_Cps() { + mNode.remove(); + } + /* 0x170 */ LinkedColliderNode mNode; +}; + +class dColliderLinkedList { +private: + cListMg_c mList; + static void Set(cCcD_Obj *obj, void *cbArg); + static void SetStts(cCcD_Obj *obj, void *cbArg); + static void AtSet(cCcD_Obj *obj, void *cbArg); + static void ClrAt(cCcD_Obj *obj, void *cbArg); + static void TgSet(cCcD_Obj *obj, void *cbArg); + static void ClrTg(cCcD_Obj *obj, void *cbArg); + static void CoSet(cCcD_Obj *obj, void *cbArg); + static void ClrCo(cCcD_Obj *obj, void *cbArg); + +public: + virtual ~dColliderLinkedList(); + + void postInit(cCcD_Obj &ccD); + void addCc(dCcD_Linked_Cyl &ccD, const dCcD_SrcCyl &src); + void addCc(dCcD_Linked_Sph &ccD, const dCcD_SrcSph &src); + void addCc(dCcD_Linked_Cps &ccD, const dCcD_SrcCps &src); + void addCc(dCcD_Linked_Unk &ccD, const dCcD_SrcUnk &src); + void SetStts(cCcD_Stts &stts); + void registerColliders(); + + typedef void (*ccCbFunc)(cCcD_Obj *obj, void *cbArg); + void foreachCc(ccCbFunc f, void *cbArg) const; + void foreachCc2(ccCbFunc f, void *cbArg) const; + + // This find function is used by a lot of other + // TUs, all of which own the function passed as + // a ptmf. It's not immediately clear how this works, + // does every actor subclass the LinkedCollider___, + // or are the functions all added here for the other + // files to implement? + typedef bool (cCcD_Obj::*ccPtmf)(); + cCcD_Obj *find(ccPtmf f) const; + + void AtSet(); + void ClrAt(); + void TgSet(); + void ClrTg(); + void CoSet(); + void ClrCo(); +}; + +#endif diff --git a/include/d/flag/tboxflag_manager.h b/include/d/flag/tboxflag_manager.h index a675b789..dd64a252 100644 --- a/include/d/flag/tboxflag_manager.h +++ b/include/d/flag/tboxflag_manager.h @@ -21,7 +21,7 @@ public: virtual ~TBoxflagManager() {} void init(); void copyFromSave(u32 sceneIndex); - bool checkFlag(u16 sceneIndex, u16 flag); + u16 checkFlag(u16 sceneIndex, u16 flag); virtual u16 getFlagCount() const; void setFlag(u16 flag); bool checkUncommittedFlag(u16 sceneIndex, u16 flag); 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/blur_and_palette_manager.h b/include/toBeSorted/blur_and_palette_manager.h new file mode 100644 index 00000000..cedc1ee4 --- /dev/null +++ b/include/toBeSorted/blur_and_palette_manager.h @@ -0,0 +1,27 @@ +#ifndef BLUR_AND_PALETTE_MANAGER_H +#define BLUR_AND_PALETTE_MANAGER_H + +#include "common.h" +#include "m/m_vec.h" + +class BlurAndPaletteManager { +public: + static BlurAndPaletteManager &GetInstance() { + return sInstance; + } + + void fn_800247D0(mVec3_c, f32); + void fn_80022AF0(f32); + void setField_0x2F20(f32 arg) { + field_0x2F20 = arg; + } + void fn_800223A0(void *); + void fn_80022440(void *); + +private: + u8 field_0x0000[0x2F20 - 0x0000]; + f32 field_0x2F20; + static BlurAndPaletteManager sInstance; +}; + +#endif diff --git a/include/toBeSorted/counters/counter.h b/include/toBeSorted/counters/counter.h index 5d0cc029..07f5b334 100644 --- a/include/toBeSorted/counters/counter.h +++ b/include/toBeSorted/counters/counter.h @@ -16,4 +16,4 @@ public: u16 counterId; }; -#endif COUNTER_H +#endif diff --git a/include/toBeSorted/counters/goddess_chest_counter.h b/include/toBeSorted/counters/goddess_chest_counter.h new file mode 100644 index 00000000..e1c62403 --- /dev/null +++ b/include/toBeSorted/counters/goddess_chest_counter.h @@ -0,0 +1,19 @@ +#ifndef GODDESS_CHEST_COUNTER_H +#define GODDESS_CHEST_COUNTER_H + +#include "toBeSorted/counters/counter.h" + +class GoddessChestCounter : public Counter { +public: + GoddessChestCounter() : Counter(0x43F) {} + virtual ~GoddessChestCounter() {}; + + virtual u16 getCommittedValue() override; + virtual u16 getMax() override; + virtual u16 getUncommittedValue() override; + virtual void setValue(u16 num) override; + + static GoddessChestCounter sInstance; +}; + +#endif diff --git a/include/toBeSorted/event.h b/include/toBeSorted/event.h index 01a6af2e..f07f8aa6 100644 --- a/include/toBeSorted/event.h +++ b/include/toBeSorted/event.h @@ -16,8 +16,9 @@ public: public: /** 0x800A0C40 */ - Event(char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2); + Event(const char *eventName, u32 unk, u32 eventFlags, void *callback1, void *callback2); Event(u32 eventId, s32 roomId, u32 eventFlags, void *callback1, void *callback2); + Event(const char *eventName, void *zevDat, u32 unk, u32 eventFlags, void *callback1, void *callback2); /** 0x800A1240 */ virtual ~Event(); }; diff --git a/include/toBeSorted/event_manager.h b/include/toBeSorted/event_manager.h index 98997300..bd98a1c9 100644 --- a/include/toBeSorted/event_manager.h +++ b/include/toBeSorted/event_manager.h @@ -12,6 +12,7 @@ class EventManager { public: static bool isInEvent(dAcBase_c *actor, const char *eventName); static bool finishEvent(dAcBase_c *actor, const char *eventName); + static void changeOwnEvent(dAcBase_c *actor1, dAcBase_c *actor2, Event *event, UNKWORD); static bool alsoSetAsCurrentEvent(dAcBase_c *actor, Event *event, void *unknown); static EventManager *sInstance; 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/REL/d/a/obj/d_a_obj_tumble_weed.cpp b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp index 212db3fb..45129dd7 100644 --- a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp +++ b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp @@ -18,6 +18,7 @@ #include "m/m_vec.h" #include "rvl/MTX/vec.h" #include "s/s_Math.h" +#include "toBeSorted/blur_and_palette_manager.h" #include "toBeSorted/dowsing_target.h" void float_ordering() { @@ -91,8 +92,6 @@ int dAcOTumbleWeed_c::doDelete() { return SUCCEEDED; } -extern "C" void fn_800247D0(void *, mVec3_c, f32); -extern "C" UNKWORD BLUR_AND_PALETTE_MGR; int dAcOTumbleWeed_c::actorExecute() { if (!mField_0x98C && !isStopped()) { @@ -106,7 +105,7 @@ int dAcOTumbleWeed_c::actorExecute() { calcWind(); sLib::chase(&mField_0x980, 1.f, 0.1f); - fn_800247D0(&BLUR_AND_PALETTE_MGR, mField_0x968, mField_0x980); + BlurAndPaletteManager::GetInstance().fn_800247D0(mField_0x968, mField_0x980); calcVelocity(); position += velocity; diff --git a/src/c/c_list.cpp b/src/c/c_list.cpp index 61929a5f..fe0330e9 100644 --- a/src/c/c_list.cpp +++ b/src/c/c_list.cpp @@ -74,3 +74,9 @@ void cListMg_c::prepend(cListNd_c *node) { } this->mpFirst = node; } + +void cListMg_c::clear() { + while (mpFirst != nullptr) { + remove(mpFirst); + } +} diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index b60fbedb..600ae9c3 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -613,6 +613,6 @@ void dAcBase_c::FUN_8002dd90() { void dAcBase_c::FUN_8002ddd0() {} // 8002de30 -void dAcBase_c::FUN_8002de30() { +void dAcBase_c::FUN_8002de30(cBgS_PolyInfo &p) { FUN_8002ddd0(); } diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp new file mode 100644 index 00000000..78ccd4d4 --- /dev/null +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -0,0 +1,2673 @@ +#include "d/a/obj/d_a_obj_tbox.h" + +#include "c/c_lib.h" +#include "c/c_math.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/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/c/c_bg_s_poly_info.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 "d/flag/tboxflag_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" +#include "nw4r/g3d/g3d_resanmtexpat.h" +#include "nw4r/g3d/g3d_resanmtexsrt.h" +#include "nw4r/g3d/g3d_resfile.h" +#include "nw4r/g3d/g3d_resmdl.h" +#include "rvl/MTX/mtxvec.h" +#include "s/s_Math.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/attention.h" +#include "toBeSorted/blur_and_palette_manager.h" +#include "toBeSorted/counters/goddess_chest_counter.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); + +static mVec3_c sDowsingTargetOffsets[] = { + mVec3_c(0.0f, 54.0f, 0.0f), mVec3_c(0.0f, 34.0f, 0.0f), mVec3_c(0.0f, 66.5f, 0.0f), mVec3_c(0.0f, 49.0f, 0.0f) +}; + +static mVec3_c sVec1 = mVec3_c(0.0f, 0.0f, -2.0f); +static mVec3_c sVec2 = mVec3_c(1.0f, 1.0f, 0.8f); +static mVec3_c sVec3 = mVec3_c(1.0f, 1.0f, 1.0f); +static mVec3_c sVec4 = mVec3_c(0.0f, 0.0f, 88.0f); + +STATE_DEFINE(dAcTbox_c, DugOut); +STATE_DEFINE(dAcTbox_c, WaitAppear); +STATE_DEFINE(dAcTbox_c, DemoAppear); +STATE_DEFINE(dAcTbox_c, WaitOpen); +STATE_DEFINE(dAcTbox_c, GoddessWaitOff); +STATE_DEFINE(dAcTbox_c, GoddessWaitOn); +STATE_DEFINE(dAcTbox_c, DeleteArchive); +STATE_DEFINE(dAcTbox_c, LoadArchive); +STATE_DEFINE(dAcTbox_c, Open); +STATE_DEFINE(dAcTbox_c, PresentItem); +STATE_DEFINE(dAcTbox_c, Close); +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", + "TBoxSmallT", + "TBoxBossT", + "GoddessTBox", +}; + +static const char *const sOpenArcName = "FX_TBoxOpen"; +static const char *const sOpenMdlName = "FX_TBoxOpen"; +static const char *const sOpenAnmChrName = "FX_TBoxOpen"; +static const char *const sOpenAnmTexSrtName = "FX_TBoxOpen"; +static const char *const sOpenAnmClrName = "FX_TBoxOpen"; + +static const char *const sAppearAnmName = "TBoxNormalT_appear"; + +static char *const sOpenEventNames[] = { + "TreasureBoxOpen", + "TreasureBoxOpenSmall", + "TreasureBoxOpenBoss", + "TreasureBoxOpen", +}; + +// clang-format off +// 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), 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; + +static char *const sAnmNames[] = { + "TBoxNormalT", + "TBoxSmallT", + "TBoxBossT", + "TBoxNormalT", +}; + +static char *const sMdlNames[] = { + "TBoxNormalT", + "TBoxSmallT", + "TBoxBossT", + "GoddessTBox", +}; + +static char *const sCloseCcNames[] = { + "TBoxNormalTClose", + "TBoxSmallTClose", + "TBoxBossTClose", + "GoddessTBoxClose", +}; + +static char *const sOpenCcNames[] = { + "TBoxNormalTOpen", + "TBoxSmallTOpen", + "TBoxBossTOpen", + "GoddessTBoxOpen", +}; + +bool dAcTbox_c::tryGetDowsingTargetOffset(int variant, mVec3_c &out) { + bool ok = dAcTbox_c::isValidVariant(variant); + if (ok) { + out.x = sDowsingTargetOffsets[variant].x; + out.y = sDowsingTargetOffsets[variant].y; + out.z = sDowsingTargetOffsets[variant].z; + } + return ok; +} + +void dAcTbox_c::getDowsingTargetOffset(int variant, mVec3_c &out) { + tryGetDowsingTargetOffset(variant, out); +} + +f32 dAcTbox_c::getSomeRate() { + return 1.0f / 8.333333f; +} + +bool dAcTbox_c::isValidGroupIndex(int idx) { + return 0 <= idx && idx < 15; +} +extern "C" void *SIREN_TAG; +extern "C" bool hasCollectedAllTears(void *SIREN_TAG); +bool dAcTbox_c::hasCollectedAllTears() { + if (SIREN_TAG == nullptr) { + return false; + } + return ::hasCollectedAllTears(SIREN_TAG); +} + +bool dAcTbox_c::getGroundHeight(f32 *height, const mVec3_c &pos) { + if (height == nullptr) { + return false; + } + bool ok = dBgS_ObjGndChk::CheckPos(pos); + if (ok) { + *height = dBgS_ObjGndChk::GetGroundHeight(); + } + return ok; +} + +bool dAcTbox_c::isBelowGroundAtPos(f32 height, const mVec3_c &pos) { + f32 gndHeight; + if (!getGroundHeight(&gndHeight, pos)) { + return false; + } + return height < gndHeight; +} + +dAcTbox_c::dAcTbox_c() + : mStateMgr(*this, sStateID::null), mScnCallback(this), mEvent(*this, nullptr), mTboxListNode(this), + mDowsingTarget(this, DowsingTarget::SLOT_NONE), mGoddessDowsingTarget(this, DowsingTarget::SLOT_NONE) { + field_0x120B = 0; + field_0x120E = 0; + mDoObstructedCheck = false; + sTboxActorList.append(&mTboxListNode); + unkByteTargetFiRelated = 2; +} + +dAcTbox_c::~dAcTbox_c() { + sTboxActorList.remove(&mTboxListNode); +} + +bool dAcTbox_c::createHeap() { + void *data = getOarcResFile(sArcNames[mVariant]); + if (data == nullptr) { + return false; + } + if (!mMdl1.create(data, sMdlNames[mVariant], sAnmNames[mVariant], &heap_allocator, 0x32F, 1, nullptr)) { + return false; + } + mMdl1.getModel().setLocalMtx(mWorldMtx); + mScnCallback.attach(mMdl1.getModel()); + if (!initBgW(mBgWs[0], sArcNames[mVariant], sCloseCcNames[mVariant])) { + return false; + } + if (!initBgW(mBgWs[1], sArcNames[mVariant], sOpenCcNames[mVariant])) { + return false; + } + + if (mVariant == GODDESS) { + nw4r::g3d::ResFile res = data; + if (!res.mFile.IsValid()) { + return false; + } + nw4r::g3d::ResMdl mdl = mMdl1.getModel().getResMdl(); + if (!mdl.IsValid()) { + return false; + } + nw4r::g3d::ResAnmTexPat anmTexPat = res.GetResAnmTexPat("GoddessTBox"); + if (!anmTexPat.mAnmTexPat.IsValid()) { + return false; + } + if (!mAnmGoddessPat.create(mdl, anmTexPat, &heap_allocator, nullptr, 1)) { + return false; + } + mMdl1.getModel().setAnm(mAnmGoddessPat); + u16 goddessTBoxActive = getParams2Lower(); + if (StoryflagManager::sInstance->getCounterOrFlag(goddessTBoxActive) && !mHasBeenOpened) { + nw4r::g3d::ResAnmTexSrt anmTexSrt = res.GetResAnmTexSrt("GoddessTBox"); + if (!anmTexSrt.mAnmTexSrt.IsValid()) { + return false; + } + if (!mAnmGoddessTexSrt.create(mdl, anmTexSrt, &heap_allocator, nullptr, 1)) { + return false; + } + mMdl1.getModel().setAnm(mAnmGoddessTexSrt); + } + } else if (mVariant == NORMAL) { + nw4r::g3d::ResFile res = data; + if (!res.mFile.IsValid()) { + return false; + } + nw4r::g3d::ResAnmClr anmClr = res.GetResAnmClr("TBoxNormalTAppear"); + if (!anmClr.mAnmClr.IsValid()) { + return false; + } + nw4r::g3d::ResMdl mdl = mMdl1.getModel().getResMdl(); + if (!mdl.IsValid()) { + return false; + } + if (!mAnmMatClr1.create(mdl, anmClr, &heap_allocator, nullptr, 1)) { + return false; + } + mAnmMatClr1.setRate(1.0f, 0); + mMdl1.getModel().setAnm(mAnmMatClr1); + } + + if (isNotSmall()) { + void *fxData = getOarcResFile(sOpenArcName); + if (fxData == nullptr) { + return false; + } + nw4r::g3d::ResFile fxRes = fxData; + if (!fxRes.mFile.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl openMdl = fxRes.GetResMdl(sOpenMdlName); + if (!openMdl.IsValid()) { + return false; + } + if (!mOpenFxMdl.create(openMdl, &heap_allocator, 0x120, 1, nullptr)) { + return false; + } + mOpenFxMdl.setPriorityDraw(0x7F, 0x86); + + nw4r::g3d::ResAnmChr openAnm = fxRes.GetResAnmChr(sOpenAnmChrName); + if (!openAnm.mAnmChr.IsValid()) { + return false; + } + if (!mAnmChr.create(openMdl, openAnm, &heap_allocator, nullptr)) { + return false; + } + mOpenFxMdl.setAnm(mAnmChr); + + nw4r::g3d::ResAnmTexSrt anmTexSrt = fxRes.GetResAnmTexSrt(sOpenAnmTexSrtName); + if (!anmTexSrt.mAnmTexSrt.IsValid()) { + return false; + } + if (!mAnmTexSrt1.create(openMdl, anmTexSrt, &heap_allocator, nullptr, 1)) { + return false; + } + mOpenFxMdl.setAnm(mAnmTexSrt1); + + nw4r::g3d::ResAnmClr anmClr = fxRes.GetResAnmClr(sOpenAnmClrName); + if (!anmClr.mAnmClr.IsValid()) { + return false; + } + if (!mAnmMatClr2.create(openMdl, anmClr, &heap_allocator, nullptr, 1)) { + return false; + } + mOpenFxMdl.setAnm(mAnmMatClr2); + mVec3_c fxPos; + fn_8026B380(fxPos); + mMtx_c fxTransform; + fxTransform.transS(fxPos); + // TODO address calculations here, otherwise this function + // matches surprisingly well + fxTransform.ZXYrotM(rotation.x, rotation.y, rotation.z); + mOpenFxMdl.setLocalMtx(fxTransform); + mOpenFxMdl.setScale(fn_8026B3C0()); + } + + return true; +} + +static u32 sSomeCounters[15] = {0}; + +int dAcTbox_c::create() { + if (!isActualVisibleBox()) { + return FAILED; + } + int roomId_tmp = roomid; + if (addActorToRoom(-1)) { + roomid = roomId_tmp; + changeLoadedEntitiesWithSet(); + } + setItemId((ITEM_ID)(rotation.z & 0x1FF)); + if (mItemId > MAX_ITEM_ID) { + return FAILED; + } + mVariant = (TboxVariant_e)sItemToTBoxVariant[mItemId]; + if (mVariant == GODDESS) { + setItemId((ITEM_ID)(MAX_ITEM_ID - mItemId)); + } + mSpawnSceneFlag = (params >> 0x14) & 0xFF; + mSetSceneFlag = rotation.x & 0xFF; + setChestFlag(); + field_0x120F = ((rotation.x >> 8) & 1) == 0; + if (!noObstructionCheck()) { + setDoObstructionCheck(); + } + field_0x1208 = (rotation.x >> 0xA) & 0xF; + switch (fn_8026B370()) { + case 0: field_0x120A = 0; break; + case 1: field_0x120A = 1; break; + case 3: field_0x120A = 3; break; + default: field_0x120A = 3; break; + } + rotation.z = 0; + rotation.x = 0; + + // This part of the code checks if there's another chest with similar properties + // and only keeps one of them. + if (isValidGroupIndex(field_0x1208) && !field_0x1210) { + sSomeCounters[field_0x1208]++; + field_0x1210 = true; + } + field_0x120D = 0; + if (fn_8026D670()) { + u32 counterValue = 0; + getSomeCounter(&counterValue); + if (counterValue > 1) { + dAcTbox_c *other; + bool keepGoing = true; + dAcObjBase_c *cursor = nullptr; + do { + other = static_cast(getNextObject(&sTboxActorList, cursor)); + cursor = other; + if (other != nullptr && this != other && !other->field_0x120D && field_0x1208 == other->field_0x1208) { + keepGoing = false; + } + } while (keepGoing && cursor != nullptr); + + bool b; + if (checkTboxFlag()) { + b = true; + } else if (other->checkTboxFlag()) { + b = false; + } else { + b = fn_8026D560(); + } + + if (b) { + other->deleteRequest(); + other->field_0x120D = true; + } else { + field_0x120D = true; + return FAILED; + } + } + } + + if (checkTboxFlag() || + (mSetSceneFlag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(roomid, mSetSceneFlag))) { + mHasBeenOpened = true; + } else { + mHasBeenOpened = false; + if (isItemRupee()) { + initDowsingTarget(DowsingTarget::SLOT_RUPEE); + } else if (dAcItem_c::isKeyPiece((ITEM_ID)mItemId)) { + initDowsingTarget(DowsingTarget::SLOT_QUEST); + } else if (dAcItem_c::isTreasure((ITEM_ID)mItemId)) { + initDowsingTarget(DowsingTarget::SLOT_TREASURE); + } + + if (mVariant == GODDESS && StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + initDowsingTargetCube(); + } + } + + if (isItemRupee() || dAcItem_c::isTreasure((ITEM_ID)mItemId)) { + mRegisterDowsingTarget = &dAcTbox_c::registerRupeeOrTreasureDowsing; + mUnregisterDowsingTarget = &dAcTbox_c::unregisterDowsing; + } else if (dAcItem_c::isKeyPiece((ITEM_ID)mItemId)) { + mRegisterDowsingTarget = &dAcTbox_c::registerKeyPieceDowsing; + mUnregisterDowsingTarget = &dAcTbox_c::noUnregisterDowsing; + } else { + mRegisterDowsingTarget = &dAcTbox_c::noRegisterDowsing; + mUnregisterDowsingTarget = &dAcTbox_c::noUnregisterDowsing; + } + + updateMatrix(); + + CREATE_ALLOCATOR(dAcTbox_c); + + mStts.SetRank(0xD); + static const dCcD_SrcUnk s1 = { + sColSrc, + {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, + }; + mCcD3.Set(s1); + mCcD3.SetStts(mStts); + static const dCcD_SrcCyl s2 = { + sColSrc, + {1.0f, 1.0f}, + }; + mCcD4.Set(s2); + mCcD4.SetStts(mStts); + if (mVariant == SMALL) { + // 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), 0x1010111, {7, 0x407}, 0, 0}, + /* mObjCo */ {0x0}}, + {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, + }; + // clang-format on + field_0x0D48.addCc(mCcD1, s3); + field_0x0D48.addCc(mCcD2, s3); + } else { + // 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), 0x1010111, {6, 0x407}, 0, 0}, + /* mObjCo */ {0x0}}, + {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, + }; + // clang-format on + field_0x0D48.addCc(mCcD1, s4); + field_0x0D48.addCc(mCcD2, s4); + } + field_0x0D48.SetStts(mStts); + // TODO figure out the right fields + mCcD1.SetTg_0x4C(-1); + mCcD2.SetTg_0x4C(-1); + mMdl1.setAnm(sAnmNames[mVariant], m3d::PLAY_MODE_4); + if (mHasBeenOpened == true) { + mMdl1.setFrame(mMdl1.getAnm().getEndFrame()); + } else { + mMdl1.setFrame(mMdl1.getAnm().getStartFrame()); + } + mMdl1.getModel().calc(false); + mMtx_c nodeMtx; + mMdl1.getModel().getNodeWorldMtx(mMdl1.getModel().getNodeID("Cover"), nodeMtx); + + nodeMtx.getTranslation(field_0x11D8); + if (mVariant == GODDESS) { + if (!mHasBeenOpened && StoryflagManager::sInstance->getCounterOrFlag(getParams2Lower())) { + mAnmGoddessPat.setFrame(1.0f, 0); + } else { + mAnmGoddessPat.setFrame(0.0f, 0); + } + } + + field_0x11F0 = 0; + switch (mVariant) { + case NORMAL: { + static mVec3_c bbLo = mVec3_c(-65.0f, 0.0f, -100.0f); + static mVec3_c bbUp = mVec3_c(65.0f, 150.0f, 45.0f); + boundingBox.Set(bbLo, bbUp); + } break; + case SMALL: { + static mVec3_c bbLo = mVec3_c(-38.0f, 0.0f, -70.0f); + static mVec3_c bbUp = mVec3_c(38.0f, 110.0f, 35.0f); + boundingBox.Set(bbLo, bbUp); + } break; + case BOSS: { + static mVec3_c bbLo = mVec3_c(-90.0f, 0.0f, -140.0f); + static mVec3_c bbUp = mVec3_c(90.0f, 170.0f, 60.0f); + boundingBox.Set(bbLo, bbUp); + } break; + case GODDESS: { + static mVec3_c bbLo = mVec3_c(-65.0f, 0.0f, -100.0f); + static mVec3_c bbUp = mVec3_c(65.0f, 150.0f, 50.0f); + boundingBox.Set(bbLo, bbUp); + } break; + } + + field_0x11EC = 1.0f; + field_0x11FC = 0; + + field_0x4E8.r = 0; + field_0x4E8.g = 0; + field_0x4E8.b = 0; + + field_0x4EC = 0.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; + } + + checkForLinkBonk(); + 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; + getCCBounds(&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, 31.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.ClrTgSet(); + } + 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; + } + + checkForLinkBonk(); + 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(&sVec4, &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; + getCCBounds(&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, 31.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.ClrTgSet(); + } + 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(&sVec1, &out); + } +} + +const mVec3_c &dAcTbox_c::fn_8026B3C0() const { + if (mVariant == BOSS) { + return sVec3; + } + return sVec2; +} + +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(sAnmNames[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); + 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); +} +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() { + 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) { + spawnAppearEffect(); + } + 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::finalizeState_DemoAppear() {} + +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(sAnmNames[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() { + 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(sAnmNames[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; + 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() { + mScale.set(1.0f, 1.0f, 1.0f); + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mMdl1.setAnm(sAnmNames[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() {} + +extern "C" void fn_800298B0(u16 effectIndex, mVec3_c *, mAng3_c *, mVec3_c *, void *, void *, void *, void *); +extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_209_; +extern "C" bool isPouchItem(u16); +extern "C" u8 adventurePouchFindItemSlot(ITEM_ID item); +extern "C" u16 findItemInItemCheck(ITEM_ID item); +extern "C" dAcItem_c *giveItem3(u16 item, s32); + +void dAcTbox_c::initializeState_Open() { + mScale.set(1.0f, 1.0f, 1.0f); + playSound(0xA36); + clearActorProperty(0x100); + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + fn_8026D370(); + + if (isNotSmall()) { + mAnmMatClr2.setFrame(mAnmMatClr2.getFrameStart(0), 0); + mAnmChr.setFrameOnly(mAnmChr.getStartFrame()); + mAnmTexSrt1.setFrame(mAnmTexSrt1.getFrameStart(0), 0); + } + + if (isNotSmall()) { + mVec3_c pos; + fn_8026B380(pos); + mVec3_c p2 = fn_8026B3C0(); + fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_209_, &pos, &rotation, &p2, nullptr, nullptr, nullptr, nullptr); + } + fn_8026D140(); + ITEM_ID itemId = mItemId != 0 ? (ITEM_ID)mItemId : ITEM_GODDESS_HARP; + if (isPouchItem(itemId) && adventurePouchFindItemSlot(ITEM_NONE) == 8 && findItemInItemCheck(ITEM_NONE) == 0x3C) { + setShouldCloseFlag(); + } + dAcItem_c *item = giveItem3(itemId, -1); + if (item != nullptr) { + mItemRef.link(item); + const char *evName; + if (dAcItem_c::getItemGetEventName(itemId, &evName)) { + Event ev(evName, 300, 4, (void *)dAcItem_c::itemGetEventStart, (void *)dAcItem_c::itemGetEventEnd); + EventManager::changeOwnEvent(this, item, &ev, 0); + } + } + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; +} +void dAcTbox_c::executeState_Open() { + mMdl1.setFrame(dAcPy_c::LINK->getCurrentAnimFrame()); + if (mVariant == GODDESS) { + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else if (mVariant != SMALL) { + // exact same code as in the other branch + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } + if (mMdl1.getAnm().isStop()) { + mStateMgr.changeState(StateID_PresentItem); + } +} +void dAcTbox_c::finalizeState_Open() {} + +void dAcTbox_c::initializeState_PresentItem() { + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; +} + +void dAcTbox_c::executeState_PresentItem() { + // Copied from executeState_Open + if (mVariant == GODDESS) { + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else if (mVariant != SMALL) { + if (0.4f < field_0x11EC) { + sLib::chase(&field_0x11EC, 0.4f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } + mEvent.advanceNext(); + if (checkShouldClose()) { + unsetShouldCloseFlag(); + mStateMgr.changeState(StateID_Close); + } else { + mHasBeenOpened = true; + if (mSetSceneFlag < 0xFF) { + SceneflagManager::sInstance->setFlag(roomid, mSetSceneFlag); + } + setTboxFlag(); + if (mVariant == GODDESS) { + mStateMgr.changeState(StateID_GoddessWait); + GoddessChestCounter::sInstance.checkedAdd(1); + } else { + mStateMgr.changeState(StateID_Wait); + } + } +} +void dAcTbox_c::finalizeState_PresentItem() {} + +void dAcTbox_c::initializeState_Close() { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_3); + if (mVariant == NORMAL) { + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + field_0x11FC = 0x2D; + field_0x11C0.set(-61.0f, 0.0f, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; +} +void dAcTbox_c::executeState_Close() { + switch ((u32)mVariant) { + case NORMAL: + case BOSS: + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } + if (!EventManager::isInEvent()) { + if (mMdl1.getAnm().isStop()) { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_1); + mStateMgr.changeState(StateID_WaitOpen); + } else { + mMdl1.play(); + } + } + break; + case SMALL: + if (!EventManager::isInEvent()) { + if (mMdl1.getAnm().isStop()) { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_1); + mStateMgr.changeState(StateID_WaitOpen); + } else { + mMdl1.play(); + } + } + break; + case GODDESS: + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } + if (!EventManager::isInEvent()) { + if (mMdl1.getAnm().isStop()) { + mMdl1.getAnm().setPlayState(m3d::PLAY_MODE_1); + mStateMgr.changeState(StateID_GoddessWaitOn); + } else { + mMdl1.play(); + } + } + break; + } +} +void dAcTbox_c::finalizeState_Close() {} + +void dAcTbox_c::initializeState_Wait() { + 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, -90.0f); + field_0x11CC.set(61.0f, 142.0f, 42.0f); + break; + case SMALL: + field_0x11C0.set(-38.0f, 0.0f, -68.0f); + field_0x11CC.set(38.0f, 101.0f, 31.0f); + break; + case BOSS: + field_0x11C0.set(-90.0f, 0.0f, -135.0f); + field_0x11CC.set(90.0f, 163.0f, 56.0f); + break; + } + field_0x120C = 1; + clearActorProperty(0x100); + if (mVariant == 0) { + mMdl1.setAnm(sAnmNames[0], m3d::PLAY_MODE_4); + mAnmMatClr1.setFrame(mAnmMatClr1.getFrameMax(0), 0); + } + mMdl1.setFrame(mMdl1.getAnm().getEndFrame()); + field_0x11FC = 0x2D; + fn_8026D130(); +} +void dAcTbox_c::executeState_Wait() { + if (mVariant == NORMAL || mVariant == BOSS) { + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } + } +} +void dAcTbox_c::finalizeState_Wait() {} + +void dAcTbox_c::initializeState_GoddessWait() { + mScale.set(1.0f, 1.0f, 1.0f); + field_0x11C0.set(-62.0f, 0.0f, -95.0f); + field_0x11CC.set(62.0f, 140.0f, 47.0f); + field_0x11E8 = 1.0f; + field_0x11F4 |= 2; + field_0x120C = 1; + clearActorProperty(0x100); + field_0x11FC = 0x2D; + fn_8026D130(); +} +void dAcTbox_c::executeState_GoddessWait() { + if (field_0x11FC <= 0) { + if (field_0x11EC < 1.0f) { + sLib::chase(&field_0x11EC, 1.0f, getSomeRate()); + BlurAndPaletteManager::GetInstance().fn_80022AF0(field_0x11EC); + // this is apparently not needed here + // BlurAndPaletteManager::GetInstance().setField_0x2F20(field_0x11EC); + } + } else { + field_0x11FC--; + } +} +void dAcTbox_c::finalizeState_GoddessWait() {} + +void dAcTbox_c::getDowsingTargetOffset(mVec3_c *out) const { + return getDowsingTargetOffset(mVariant, *out); +} + +bool dAcTbox_c::fn_8026D120() const { + return true; +} + +void dAcTbox_c::fn_8026D130() { + setActorProperty(0x1); +} + +void dAcTbox_c::fn_8026D140() { + clearActorProperty(0x1); +} + +void dAcTbox_c::doInteraction(s32 _unused) { + void *zevDat = getOarcZev(sArcNames[mVariant]); + if (zevDat != nullptr) { + Event ev(sOpenEventNames[mVariant], zevDat, 100, 0x100001, 0, 0); + mEvent.scheduleEvent(ev, 0); + } +} + +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::checkShouldClose() { + return field_0x11F4 & 0x1; +} + +void dAcTbox_c::setShouldCloseFlag() { + setFlags(field_0x11F4 | 0x1); +} + +void dAcTbox_c::unsetShouldCloseFlag() { + setFlags(field_0x11F4 & ~0x1); +} + +void dAcTbox_c::fn_8026D370() { + if (isNotSmall()) { + field_0x11F0 = 1; + BlurAndPaletteManager::GetInstance().fn_800223A0(&field_0x4DC); + } +} + +void dAcTbox_c::fn_8026D3C0() { + if (mAnmChr.isStop() && mAnmTexSrt1.isStop(0) && mAnmMatClr2.isStop(0)) { + field_0x11F0 = 0; + BlurAndPaletteManager::GetInstance().fn_80022440(&field_0x4DC); + } else { + mAnmChr.play(); + mAnmTexSrt1.play(); + mAnmMatClr2.play(); + field_0x4E8.r = 0xAA; + field_0x4E8.g = 0x96; + field_0x4E8.b = 0x96; + field_0x4EC = 125.0f; + } +} + +void dAcTbox_c::setChestFlag() { + field_0x1207 = (rotation.z >> 9) & 0x3F; +} + +void dAcTbox_c::setTboxFlag() { + if (field_0x1207 <= 0x1F) { + TBoxflagManager::sInstance->setFlag(field_0x1207); + } +} + +bool dAcTbox_c::checkTboxFlag() const { + if (field_0x1207 <= 0x1F) { + return TBoxflagManager::sInstance->checkFlag(TBoxflagManager::sInstance->mSceneIndex, field_0x1207); + } + return false; +} + +bool dAcTbox_c::isNotSmall() const { + return mVariant != SMALL; +} + +bool dAcTbox_c::fn_8026D540() { + return field_0x11F0 == 1; +} + +bool dAcTbox_c::fn_8026D560() const { + if (isValidGroupIndex(field_0x1208)) { + u32 counterVal; + getSomeCounter(&counterVal); + f32 cmp = 1.0f / counterVal; + return cM::rndF(1.0f) <= cmp; + } + return true; +} + +bool dAcTbox_c::getSomeCounter(u32 *outValue) const { + bool ok = isValidGroupIndex(field_0x1208); + if (ok) { + *outValue = sSomeCounters[field_0x1208]; + ok = *outValue; + } + return ok; +} + +bool dAcTbox_c::fn_8026D670() const { + return isValidGroupIndex(field_0x1208); +} + +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; + } +} + +extern "C" u16 PARTICLE_RESOURCE_ID_MAPPING_208_; + +void dAcTbox_c::spawnAppearEffect() { + fn_800298B0(PARTICLE_RESOURCE_ID_MAPPING_208_, &position, &rotation, nullptr, nullptr, nullptr, nullptr, nullptr); +} + +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 (isBelowGroundAtPos(fs[fsIdxes[i]], points[0])) { + isClear = false; + } else { + i++; + } + } + + return isClear; +} + +void dAcTbox_c::fn_8026DAC0(mAng &ang) { + ang = rotation.y - 0x8000; +} + +void dAcTbox_c::fn_8026DAD0(const mVec3_c *a, mVec3_c *b) const { + PSMTXMultVec(mWorldMtx, *a, *b); +} + +void dAcTbox_c::getCylParams(mVec3_c *c, f32 *r, f32 *h) const { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 70.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -24.0f); + } + if (r != nullptr) { + *r = 86.0f; + } + if (h != nullptr) { + *h = 140.0f; + } + break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 48.0f; + } + if (h != nullptr) { + *h = 68.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -14.0f); + } + if (r != nullptr) { + *r = 60.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 100.0f; + } + if (h != nullptr) { + *h = 132.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -44.0f); + } + if (r != nullptr) { + *r = 122.0f; + } + if (h != nullptr) { + *h = 160.0f; + } + break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 73.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -23.0f); + } + if (r != nullptr) { + *r = 88.0f; + } + if (h != nullptr) { + *h = 140.0f; + } + break; + } + break; + } + if (c != nullptr) { + PSMTXMultVec(mWorldMtx, *c, *c); + } +} + +void dAcTbox_c::getCCBounds(mVec3_c *lo, mVec3_c *up) const { + if (lo != nullptr) { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: lo->set(-61.0f, 0.0f, -42.0f); break; + case 1: lo->set(-61.0f, 0.0f, -90.0f); break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: lo->set(-38.0f, 0.0f, -35.0f); break; + case 1: lo->set(-38.0f, 0.0f, -68.0f); break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: lo->set(-90.0f, 0.0f, -53.0f); break; + case 1: lo->set(-90.0f, 0.0f, -135.0f); break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: lo->set(-62.0f, 0.0f, -47.0f); break; + case 1: lo->set(-62.0f, 0.0f, -95.0f); break; + } + break; + } + } + if (up != nullptr) { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: up->set(61.0f, 100.0f, 42.0f); break; + case 1: up->set(61.0f, 142.0f, 42.0f); break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: up->set(38.0f, 68.0f, 35.0f); break; + case 1: up->set(38.0f, 101.0f, 31.0f); break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: up->set(90.0f, 133.0f, 56.0f); break; + case 1: up->set(90.0f, 163.0f, 56.0f); break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: up->set(62.0f, 100.0f, 47.0f); break; + case 1: up->set(62.0f, 140.0f, 47.0f); break; + } + break; + } + } +} + +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; + } + } +} + +bool dAcTbox_c::checkForLinkBonk() { + if (!mCcD4.ChkCoHit()) { + return false; + } + dAcPy_c *link = dAcPy_c::LINK; + if (link == nullptr) { + return false; + } + if (link->getCurrentAction() != /* ROLL */ 12) { + return false; + } + + mVec3_c linkPos; + PSMTXMultVec(mCcD3.mInvMtx, link->position, linkPos); + mVec3_c ccLo, ccHi; + getCCBounds(&ccLo, &ccHi); + // Math performed in local coordinate space + // All of this is wrong + if (!(ccLo.y <= linkPos.y + 100.0f && linkPos.y <= ccHi.y)) { + return false; + } + + bool bonk = false; + bonk = bonk || + (ccLo.x <= linkPos.x && linkPos.x <= ccHi.x) && (ccLo.z - 80.0f <= linkPos.z && linkPos.z <= ccHi.z + 80.0f); + bonk = bonk || + (ccLo.z <= linkPos.z && linkPos.z <= ccHi.z) && (ccLo.x - 80.0f <= linkPos.x && linkPos.x <= ccHi.x + 80.0f); + bonk = bonk || (linkPos.x < ccLo.x && linkPos.z < ccLo.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (ccHi.x < linkPos.x && ccHi.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (linkPos.x < ccLo.x && ccLo.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (ccHi.x < linkPos.x && linkPos.z < ccHi.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + + if (!bonk) { + return false; + } + + int direction = 0; + mVec3_c diff = mVec3_c(linkPos.x - mCcD3.mField_0xA8.x, 0.0f, linkPos.z - mCcD3.mField_0xA8.z); + if (VEC3LenSq(diff) <= FLT_EPSILON) { + return false; + } + + // TODO + + link->bonk(); + + return false; +} + +void dAcTbox_c::fn_8026E630() { + mVec3_c offset = mVec3_c::Ey * 10.0f; + mVec3_c checkPos = position + offset; + // TODO reference vs pointer + if (dBgS_ObjGndChk::CheckPos(checkPos) && &dBgS_ObjGndChk::GetInstance()) { + cBgS_PolyInfo p = dBgS_ObjGndChk::GetInstance(); + dBgS::GetInstance()->SetLightingCode(this, p); + FUN_8002de30(p); + } +} diff --git a/src/d/col/c/c_cc_d.cpp b/src/d/col/c/c_cc_d.cpp index 1dd65c6d..f8669ee6 100644 --- a/src/d/col/c/c_cc_d.cpp +++ b/src/d/col/c/c_cc_d.cpp @@ -1237,7 +1237,7 @@ bool cCcD_CylAttr::CrossCo(cCcD_CpsAttr &cpsAttr, f32 *pOut) { } bool cCcD_CylAttr::CrossCo(cCcD_UnkAttr &unkAttr, f32 *pOut) { - cM3dGCyl::Cross(unkAttr, pOut); + return cM3dGCyl::Cross(unkAttr, pOut); } void cCcD_CylAttr::CalcAabBox() { diff --git a/src/d/d_carry.cpp b/src/d/d_carry.cpp new file mode 100644 index 00000000..ce473dd4 --- /dev/null +++ b/src/d/d_carry.cpp @@ -0,0 +1,12 @@ +#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_cc.cpp b/src/d/d_cc.cpp new file mode 100644 index 00000000..f8c0750f --- /dev/null +++ b/src/d/d_cc.cpp @@ -0,0 +1,157 @@ +#include "d/d_cc.h" + +#include "common.h" +#include "d/col/c/c_cc_d.h" +#include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" + + +void dColliderLinkedList::postInit(cCcD_Obj &ccD) { + if (ccD.ChkAtSet()) { + ccD.SetAt_0x40000000(); + } + if (ccD.ChkTgSet()) { + ccD.SetTg_0x40000000(); + } + if (ccD.ChkCoSet()) { + ccD.SetCo_0x40000000(); + } +} + +void dColliderLinkedList::addCc(dCcD_Linked_Cyl &ccD, const dCcD_SrcCyl &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void dColliderLinkedList::addCc(dCcD_Linked_Sph &ccD, const dCcD_SrcSph &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void dColliderLinkedList::addCc(dCcD_Linked_Cps &ccD, const dCcD_SrcCps &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void dColliderLinkedList::addCc(dCcD_Linked_Unk &ccD, const dCcD_SrcUnk &src) { + ccD.Set(src); + mList.append(&ccD.mNode); + ccD.mNode.mpList = &mList; + postInit(ccD); +} + +void dColliderLinkedList::foreachCc(ccCbFunc f, void *cbArg) const { + LinkedColliderNode *nd = static_cast(mList.getFirst()); + while (nd != nullptr) { + f(nd->mpCcDObj, cbArg); + nd = static_cast(nd->getNext()); + } +} + +// What's the difference between these two? +void dColliderLinkedList::foreachCc2(ccCbFunc f, void *cbArg) const { + LinkedColliderNode *nd = static_cast(mList.getFirst()); + while (nd != nullptr) { + f(nd->mpCcDObj, cbArg); + nd = static_cast(nd->getNext()); + } +} + +void dColliderLinkedList::Set(cCcD_Obj *obj, void *cbArg) { + dCcS::GetInstance()->Set(obj); +} + +void dColliderLinkedList::registerColliders() { + foreachCc(Set, nullptr); +} + +void dColliderLinkedList::SetStts(cCcD_Obj *obj, void *cbArg) { + obj->SetStts(*static_cast(cbArg)); +} + +void dColliderLinkedList::SetStts(cCcD_Stts &stts) { + foreachCc(SetStts, &stts); +} + +cCcD_Obj *dColliderLinkedList::find(ccPtmf f) const { + cCcD_Obj *o; + LinkedColliderNode *nd = static_cast(mList.getFirst()); + while (nd != nullptr) { + o = nd->mpCcDObj; + if ((o->*f)()) { + return o; + } + nd = static_cast(nd->getNext()); + } + return nullptr; +} + +void dColliderLinkedList::AtSet(cCcD_Obj *obj, void *cbArg) { + if (!obj->ChkAt_0x40000000()) { + return; + } + obj->OnAtSet(); +} + +void dColliderLinkedList::AtSet() { + foreachCc(AtSet, nullptr); +} + +void dColliderLinkedList::ClrAt(cCcD_Obj *obj, void *cbArg) { + obj->ClrAtSet(); + obj->ClrAtHit(); +} + +void dColliderLinkedList::ClrAt() { + foreachCc(ClrAt, nullptr); +} + +void dColliderLinkedList::TgSet(cCcD_Obj *obj, void *cbArg) { + if (!obj->ChkTg_0x40000000()) { + return; + } + obj->OnTgSet(); +} + +void dColliderLinkedList::TgSet() { + foreachCc(TgSet, nullptr); +} + +void dColliderLinkedList::ClrTg(cCcD_Obj *obj, void *cbArg) { + obj->ClrTgSet(); + obj->ClrTgHit(); +} + +void dColliderLinkedList::ClrTg() { + foreachCc(ClrTg, nullptr); +} + +void dColliderLinkedList::CoSet(cCcD_Obj *obj, void *cbArg) { + if (!obj->ChkCo_0x40000000()) { + return; + } + obj->OnCoSet(); +} + +void dColliderLinkedList::CoSet() { + foreachCc(CoSet, nullptr); +} + +void dColliderLinkedList::ClrCo(cCcD_Obj *obj, void *cbArg) { + obj->ClrCoSet(); + obj->ClrCoHit(); +} + +void dColliderLinkedList::ClrCo() { + foreachCc(ClrCo, nullptr); +} + +dColliderLinkedList::~dColliderLinkedList() { + mList.clear(); +} diff --git a/src/d/flag/tboxflag_manager.inc b/src/d/flag/tboxflag_manager.inc index a00ac045..a2eb7e07 100644 --- a/src/d/flag/tboxflag_manager.inc +++ b/src/d/flag/tboxflag_manager.inc @@ -33,7 +33,7 @@ void TBoxflagManager::copyFromSave(u32 sceneIndex) { } /* 0x800BE990 */ -bool TBoxflagManager::checkFlag(u16 sceneIndex, u16 flag) { +u16 TBoxflagManager::checkFlag(u16 sceneIndex, u16 flag) { s32 actualFlag = (flag + sceneIndex * 0x20); return mFlagHelper.checkFlag( actualFlag / 16, flag % 16, FileManager::getInstance()->getTBoxFlagsConst(), getFlagCount() 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) {