diff --git a/config/SOUE01/rels/d_a_obj_soilNP/symbols.txt b/config/SOUE01/rels/d_a_obj_soilNP/symbols.txt index b710b3f7..e8d31fcc 100644 --- a/config/SOUE01/rels/d_a_obj_soilNP/symbols.txt +++ b/config/SOUE01/rels/d_a_obj_soilNP/symbols.txt @@ -8,15 +8,15 @@ __dt__23sFState_c<10dAcOsoil_c>Fv = .text:0x00000210; // type:function size:0x58 __dt__26sFStateFct_c<10dAcOsoil_c>Fv = .text:0x00000270; // type:function size:0x6C __dt__79sStateMgr_c<10dAcOsoil_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x000002E0; // type:function size:0xA0 __dt__49sFStateMgr_c<10dAcOsoil_c,20sStateMethodUsr_FI_c>Fv = .text:0x00000380; // type:function size:0xA4 -AcOSoil__initModels = .text:0x00000430; // type:function size:0x17C -AcOSoil__init = .text:0x000005B0; // type:function size:0x340 -AcOSoil__init2 = .text:0x000008F0; // type:function size:0x2F4 +createHeap__10dAcOsoil_cFv = .text:0x00000430; // type:function size:0x17C +actorCreate__10dAcOsoil_cFv = .text:0x000005B0; // type:function size:0x340 +actorPostCreate__10dAcOsoil_cFv = .text:0x000008F0; // type:function size:0x2F4 changeState__79sStateMgr_c<10dAcOsoil_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x00000BF0; // type:function size:0x10 -fn_255_C00 = .text:0x00000C00; // type:function size:0x30 -AcOSoil__update = .text:0x00000C30; // type:function size:0x298 +doDelete__10dAcOsoil_cFv = .text:0x00000C00; // type:function size:0x30 +actorExecute__10dAcOsoil_cFv = .text:0x00000C30; // type:function size:0x298 executeState__79sStateMgr_c<10dAcOsoil_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x00000ED0; // type:function size:0x10 getStateID__79sStateMgr_c<10dAcOsoil_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x00000EE0; // type:function size:0x10 -AcOSoil__draw = .text:0x00000EF0; // type:function size:0x108 +draw__10dAcOsoil_cFv = .text:0x00000EF0; // type:function size:0x108 initializeState_Soil__10dAcOsoil_cFv = .text:0x00001000; // type:function size:0x78 executeState_Soil__10dAcOsoil_cFv = .text:0x00001080; // type:function size:0x198 finalizeState_Soil__10dAcOsoil_cFv = .text:0x00001220; // type:function size:0x4 @@ -25,19 +25,17 @@ executeState_Hole__10dAcOsoil_cFv = .text:0x00001260; // type:function size:0x74 finalizeState_Hole__10dAcOsoil_cFv = .text:0x000012E0; // type:function size:0x4 initializeState_Ready__10dAcOsoil_cFv = .text:0x000012F0; // type:function size:0x1C4 executeState_Ready__10dAcOsoil_cFv = .text:0x000014C0; // type:function size:0x1A4 -finalizeState_Ready__10dAcOsoil_cFv = .text:0x00001670; // type:function size:0x3C -fn_255_16AC = .text:0x000016AC; // type:function size:0x4 -fn_255_16B0 = .text:0x000016B0; // type:function size:0x138 -fn_255_17F0 = .text:0x000017F0; // type:function size:0x98 -fn_255_1890 = .text:0x00001890; // type:function size:0xE4 -fn_255_1980 = .text:0x00001980; // type:function size:0xC8 -fn_255_1A50 = .text:0x00001A50; // type:function size:0x100 -fn_255_1B50 = .text:0x00001B50; // type:function size:0xB8 -fn_255_1C10 = .text:0x00001C10; // type:function size:0x164 -fn_255_1D80 = .text:0x00001D80; // type:function size:0x44 -fn_255_1DC4 = .text:0x00001DC4; // type:function size:0x4 -fn_255_1DD0 = .text:0x00001DD0; // type:function size:0xC0 -fn_255_1E90 = .text:0x00001E90; // type:function size:0x230 +finalizeState_Ready__10dAcOsoil_cFv = .text:0x00001670; // type:function size:0x40 +tryLinkTbox__10dAcOsoil_cFv = .text:0x000016B0; // type:function size:0x138 +giveItemRepeated__10dAcOsoil_cFv = .text:0x000017F0; // type:function size:0x98 +giveItemFinal__10dAcOsoil_cFv = .text:0x00001890; // type:function size:0xE4 +calcItemAndInsectSpawnPos__10dAcOsoil_cFv = .text:0x00001980; // type:function size:0xC8 +fn_255_1A50__10dAcOsoil_cFv = .text:0x00001A50; // type:function size:0x100 +checkCoHit__10dAcOsoil_cFPb = .text:0x00001B50; // type:function size:0xB8 +setModelColorFromParams__10dAcOsoil_cFP8_GXColorRQ23m3d6smdl_c = .text:0x00001C10; // type:function size:0x164 +fn_255_1D80__10dAcOsoil_cFv = .text:0x00001D80; // type:function size:0x48 +setModelAlphaToGlobalAlpha__10dAcOsoil_cFv = .text:0x00001DD0; // type:function size:0xC0 +handleModelsOpacities__10dAcOsoil_cFv = .text:0x00001E90; // type:function size:0x230 __dt__10dAcOsoil_cFv = .text:0x000020C0; // type:function size:0x11C build__26sFStateFct_c<10dAcOsoil_c>FRC12sStateIDIf_c = .text:0x000021E0; // type:function size:0x60 dispose__26sFStateFct_c<10dAcOsoil_c>FRP10sStateIf_c = .text:0x00002240; // type:function size:0xC @@ -59,32 +57,68 @@ isSameName__25sFStateID_c<10dAcOsoil_c>CFPCc = .text:0x00002680; // type:functio _ctors = .ctors:0x00000000; // type:label scope:global _dtors = .dtors:0x00000000; // type:label scope:global __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 scope:global -lbl_255_rodata_0 = .rodata:0x00000000; // type:object size:0x1C data:float -lbl_255_rodata_1C = .rodata:0x0000001C; // type:object size:0x20 align:4 data:float -lbl_255_rodata_3C = .rodata:0x0000003C; // type:object size:0x14 align:4 data:float -lbl_255_rodata_50 = .rodata:0x00000050; // type:object size:0x4 align:4 data:float -lbl_255_rodata_54 = .rodata:0x00000054; // type:object size:0x4 align:4 data:float -lbl_255_rodata_58 = .rodata:0x00000058; // type:object size:0x4 align:4 data:float -lbl_255_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 align:4 data:float -lbl_255_rodata_60 = .rodata:0x00000060; // type:object size:0x40 align:4 data:float -g_profile_OBJ_SOIL = .data:0x00000000; // type:object size:0x40 data:4byte -lbl_255_data_40 = .data:0x00000040; // type:object size:0xB data:string -lbl_255_data_4C = .data:0x0000004C; // type:object size:0x5C -lbl_255_data_A8 = .data:0x000000A8; // type:object size:0x5 data:string -lbl_255_data_B0 = .data:0x000000B0; // type:object size:0xF data:string -lbl_255_data_C0 = .data:0x000000C0; // type:object size:0x10 data:string -AcOSoil__vtable = .data:0x000000D0; // type:object size:0x80 -lbl_255_data_150 = .data:0x00000150; // type:object size:0x30 -lbl_255_data_180 = .data:0x00000180; // type:object size:0x30 -lbl_255_data_1B0 = .data:0x000001B0; // type:object size:0x18 -lbl_255_data_1C8 = .data:0x000001C8; // type:object size:0xD8 -lbl_255_data_2A0 = .data:0x000002A0; // type:object size:0x34 +lbl_255_rodata_0 = .rodata:0x00000000; // type:object size:0x1C scope:local data:float +lbl_255_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_28 = .rodata:0x00000028; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_2C = .rodata:0x0000002C; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_30 = .rodata:0x00000030; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_34 = .rodata:0x00000034; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_38 = .rodata:0x00000038; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_40 = .rodata:0x00000040; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_44 = .rodata:0x00000044; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_48 = .rodata:0x00000048; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_4C = .rodata:0x0000004C; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_50 = .rodata:0x00000050; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_54 = .rodata:0x00000054; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_58 = .rodata:0x00000058; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_5C = .rodata:0x0000005C; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_60 = .rodata:0x00000060; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_64 = .rodata:0x00000064; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_68 = .rodata:0x00000068; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_6C = .rodata:0x0000006C; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_70 = .rodata:0x00000070; // type:object size:0x4 scope:local align:4 data:float +lbl_255_rodata_74 = .rodata:0x00000074; // type:object size:0x2C scope:local align:4 data:4byte +g_profile_OBJ_SOIL = .data:0x00000000; // type:object size:0x10 data:4byte +sCylSrc__10dAcOsoil_c = .data:0x00000010; // type:object size:0x30 data:4byte +lbl_255_data_40 = .data:0x00000040; // type:object size:0xB scope:local data:string +lbl_255_data_4C = .data:0x0000004C; // type:object size:0xA scope:local data:string +lbl_255_data_58 = .data:0x00000058; // type:object size:0x10 scope:local data:4byte +lbl_255_data_68 = .data:0x00000068; // type:object size:0x10 scope:local data:4byte +lbl_255_data_78 = .data:0x00000078; // type:object size:0xC scope:local data:string +lbl_255_data_88 = .data:0x00000088; // type:object size:0x18 scope:local data:string +lbl_255_data_A0 = .data:0x000000A0; // type:object size:0x5 scope:local data:string +lbl_255_data_A8 = .data:0x000000A8; // type:object size:0x5 scope:local data:string +lbl_255_data_B0 = .data:0x000000B0; // type:object size:0xF scope:local data:string +lbl_255_data_C0 = .data:0x000000C0; // type:object size:0x10 scope:local data:string +__vt__10dAcOsoil_c = .data:0x000000D0; // type:object size:0x80 +__vt__49sFStateMgr_c<10dAcOsoil_c,20sStateMethodUsr_FI_c> = .data:0x00000150; // type:object size:0x30 +__vt__79sStateMgr_c<10dAcOsoil_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x00000180; // type:object size:0x30 +__vt__26sFStateFct_c<10dAcOsoil_c> = .data:0x000001B0; // type:object size:0x14 +__vt__23sFState_c<10dAcOsoil_c> = .data:0x000001C8; // type:object size:0x18 +lbl_255_data_1E0 = .data:0x000001E0; // type:object size:0xC +lbl_255_data_1EC = .data:0x000001EC; // type:object size:0xC +lbl_255_data_1F8 = .data:0x000001F8; // type:object size:0xC +lbl_255_data_204 = .data:0x00000204; // type:object size:0xC +lbl_255_data_210 = .data:0x00000210; // type:object size:0xC +lbl_255_data_21C = .data:0x0000021C; // type:object size:0xC +lbl_255_data_228 = .data:0x00000228; // type:object size:0xC +lbl_255_data_234 = .data:0x00000234; // type:object size:0xC +lbl_255_data_240 = .data:0x00000240; // type:object size:0xC +lbl_255_data_24C = .data:0x0000024C; // type:object size:0x19 data:string +lbl_255_data_268 = .data:0x00000268; // type:object size:0x19 data:string +lbl_255_data_284 = .data:0x00000284; // type:object size:0x1A data:string +lbl_255_data_2A0 = .data:0x000002A0; // type:object size:0x34 scope:local __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -lbl_255_bss_8 = .bss:0x00000008; // type:object size:0x10 data:4byte -StateID_Soil__10dAcOsoil_c = .bss:0x00000018; // type:object size:0x40 data:4byte -StateID_Hole__10dAcOsoil_c = .bss:0x00000058; // type:object size:0x40 data:4byte +lbl_255_bss_8 = .bss:0x00000008; // type:object size:0x10 scope:local data:4byte +StateID_Soil__10dAcOsoil_c = .bss:0x00000018; // type:object size:0x30 data:4byte +lbl_255_bss_48 = .bss:0x00000048; // type:object size:0x10 scope:local data:4byte +StateID_Hole__10dAcOsoil_c = .bss:0x00000058; // type:object size:0x30 data:4byte +lbl_255_bss_88 = .bss:0x00000088; // type:object size:0x10 scope:local data:4byte StateID_Ready__10dAcOsoil_c = .bss:0x00000098; // type:object size:0x30 data:4byte -lbl_255_bss_C8 = .bss:0x000000C8; // type:object size:0x1 data:byte -lbl_255_bss_CC = .bss:0x000000CC; // type:object size:0xC align:4 data:float -lbl_255_bss_D8 = .bss:0x000000D8; // type:object size:0x1 data:byte -lbl_255_bss_DC = .bss:0x000000DC; // type:object size:0x14 data:byte +lbl_255_bss_C8 = .bss:0x000000C8; // type:object size:0x1 scope:local data:byte +lbl_255_bss_CC = .bss:0x000000CC; // type:object size:0xC scope:local align:4 data:float +lbl_255_bss_D8 = .bss:0x000000D8; // type:object size:0x1 scope:local data:byte +lbl_255_bss_DC = .bss:0x000000DC; // type:object size:0x14 scope:local data:byte diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 36f66bc8..9888abf8 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2473,7 +2473,7 @@ turnSoupCold = .text:0x8005BBD0; // type:function size:0x8 addExtraHearts = .text:0x8005BBE0; // type:function size:0x74 AcItem__healLink = .text:0x8005BC60; // type:function size:0x18 getCurrentHealthCapacity__7dAcPy_cFv = .text:0x8005BC80; // type:function size:0x54 -addDigInteractionTarget = .text:0x8005BCE0; // type:function size:0xC +addDigInteractionTarget__7dAcPy_cFP9dAcBase_cf = .text:0x8005BCE0; // type:function size:0xC fn_8005BCF0 = .text:0x8005BCF0; // type:function size:0x30 ActorLink__playLinkSound = .text:0x8005BD20; // type:function size:0x40 fn_8005BD60 = .text:0x8005BD60; // type:function size:0x4 diff --git a/configure.py b/configure.py index a0133566..36a6f5b5 100644 --- a/configure.py +++ b/configure.py @@ -2678,7 +2678,7 @@ config.libs = [ "REL/d/a/obj/d_a_obj_slice_log_parts.cpp", ), Rel(Matching, "d_a_obj_smoke", "REL/d/a/obj/d_a_obj_smoke.cpp"), - Rel(NonMatching, "d_a_obj_soil", "REL/d/a/obj/d_a_obj_soil.cpp"), + Rel(Matching, "d_a_obj_soil", "REL/d/a/obj/d_a_obj_soil.cpp"), Rel(NonMatching, "d_a_obj_spider_line", "REL/d/a/obj/d_a_obj_spider_line.cpp"), Rel(Matching, "d_a_obj_spike", "REL/d/a/obj/d_a_obj_spike.cpp"), Rel(Matching, "d_a_obj_stage_cover", "REL/d/a/obj/d_a_obj_stage_cover.cpp"), diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 6df2237e..35eb1f57 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -78,6 +78,7 @@ public: AC_PROP_0x4000000 = (1 << 26), AC_PROP_0x8000000 = (1 << 27), AC_PROP_0x10000000 = (1 << 28), + AC_PROP_0x20000000 = (1 << 29), AC_PROP_0x40000000 = (1 << 30), }; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 04c95e2c..d56631eb 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -62,6 +62,8 @@ public: // Item select/equip/use functions [0x801E3160 - 0x801E7AD0] ? static s32 calcItemWheelSelection(bool reset, s32 numOptions); + static void addDigInteractionTarget(dAcBase_c*, f32); + public: f32 getField_0x4564() const { return field_0x4564; diff --git a/include/d/a/obj/d_a_obj_soil.h b/include/d/a/obj/d_a_obj_soil.h index 64f1f0f9..07a8222b 100644 --- a/include/d/a/obj/d_a_obj_soil.h +++ b/include/d/a/obj/d_a_obj_soil.h @@ -1,26 +1,116 @@ #ifndef D_A_OBJ_SOIL_H #define D_A_OBJ_SOIL_H +#include "common.h" +#include "d/a/d_a_base.h" #include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_tbox.h" +#include "d/col/bg/d_bg_w.h" +#include "d/col/cc/d_cc_d.h" +#include "d/t/d_t_insect.h" +#include "m/m3d/m_smdl.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "rvl/GX/GXTypes.h" #include "s/s_State.hpp" #include "s/s_StateMgr.hpp" +#include "toBeSorted/dowsing_target.h" class dAcOsoil_c : public dAcObjBase_c { public: - dAcOsoil_c() : mStateMgr(*this, sStateID::null) {} + dAcOsoil_c() : mStateMgr(*this, sStateID::null), mResFile(nullptr), mDowsingTarget(this, DowsingTarget::SLOT_NONE) {} virtual ~dAcOsoil_c() {} STATE_FUNC_DECLARE(dAcOsoil_c, Soil); STATE_FUNC_DECLARE(dAcOsoil_c, Hole); STATE_FUNC_DECLARE(dAcOsoil_c, Ready); + enum Subtype { + SUBTYPE_VENT, // used by instances spawned by dAcOWind_c + SUBTYPE_TBOX, // unused? + SUBTYPE_DROP, // you can dig up items from this one + SUBTYPE_MOGMA, // when dug up, a mogma appears + SUBTYPE_KEY_PIECE, + }; + + enum Itemtype { + ITEMTYPE_KEY_PIECE, + ITEMTYPE_DIRECT_GIVE, // used for the small key in Skyview 2 + ITEMTYPE_DROP, + }; + + enum ModelIndex { + MODEL_COVERED, + MODEL_DUG_UP, + }; + bool isStateHole() { return mStateMgr.isState(StateID_Hole); } + STATE_MGR_DEFINE_UTIL_EXECUTESTATE(dAcOsoil_c); + private: - /* 0x330 */ u8 field_0x330[0x6CC-0x330]; + /* 0x330 */ nw4r::g3d::ResFile mResFile; + /* 0x334 */ m3d::smdl_c mModels[2]; + /* 0x36C */ dBgW mActorInteraction; + /* 0x57C */ dCcD_Cyl mCollider; /* 0x6CC */ STATE_MGR_DECLARE(dAcOsoil_c); + /* 0x708 */ dAcRef_c mTboxLink; + /* 0x714 */ dAcRef_c mInsectLink; + /* 0x720 */ DowsingTarget mDowsingTarget; + /* 0x740 */ GXColor mColors[2]; + /* 0x748 */ u8 field_0x748[0x778 - 0x748]; // unused + /* 0x778 */ mVec3_c mItemAndInsectSpawnPos; + /* 0x784 */ u16 mFinalDigTimer; + /* 0x786 */ u8 mModelIndex; + /* 0x787 */ u8 mSubtype; + /* 0x788 */ u8 mSceneflag; + /* 0x789 */ u8 mSpawnSceneflag; + /* 0x78A */ u8 mCountInParams; + /* 0x78B */ u8 mDigsLeft; + /* 0x78C */ u8 mItemSubtype; + /* 0x78D */ u8 mSomeCounter1; + /* 0x78E */ u8 mDowsingStateRelated; + /* 0x78F */ bool mHasTriedTboxLink; + /* 0x790 */ bool mInteractionDisabled; + /* 0x791 */ bool mTboxPrepared; + /* 0x792 */ bool mForInsects; + /* 0x793 */ bool field_0x793; + /* 0x794 */ bool mAlwaysLoaded; + /* 0x795 */ bool mIsHidden; + /* 0x796 */ bool mHideCover; + /* 0x797 */ bool field_0x797; // unused + /* 0x798 */ bool mShouldSetFlagInEvent; + /* 0x799 */ bool mHideWhenCameraNear; + + static dCcD_SrcCyl sCylSrc; + + bool isSubtypeVentOrDrop() const { + return mSubtype == SUBTYPE_VENT || mSubtype == SUBTYPE_DROP; + } + + s32 getSubtype() const { + return mSubtype; + } + + virtual int doDelete() override; + virtual int actorCreate() override; + virtual bool createHeap() override; + virtual int actorPostCreate() override; + virtual int actorExecute() override; + virtual int draw() override; + bool checkCoHit(bool*); + void giveItemRepeated(); + void calcItemAndInsectSpawnPos(); + void tryLinkTbox(); + void giveItemFinal(); + void fn_255_1A50(); + void setModelColorFromParams(GXColor* pOutColor, m3d::smdl_c& mdl); + void fn_255_1D80(); + void setModelAlphaToGlobalAlpha(); + void handleModelsOpacities(); + void test(); }; #endif diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 73be114a..4aeb1004 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -1012,6 +1012,9 @@ public: void OnCoSet() { mCo.OnSPrm(1); } + void OffCoSet() { + mCo.OffSPrm(1); + } u32 ChkCoSet2() const { return mCo.MskSPrm(0x800); } diff --git a/include/d/d_light_env.h b/include/d/d_light_env.h index c5c98188..8e4cc20b 100644 --- a/include/d/d_light_env.h +++ b/include/d/d_light_env.h @@ -22,6 +22,11 @@ public: void reset(); + void setTev1Color(GXColor color) { + mTev1Color = color; + mUseTev1 = true; + } + public: /* 0x0C */ f32 field_0x0C; /* 0x10 */ f32 field_0x10; diff --git a/include/d/t/d_t_insect.h b/include/d/t/d_t_insect.h index 36ef7e62..4264805f 100644 --- a/include/d/t/d_t_insect.h +++ b/include/d/t/d_t_insect.h @@ -1,6 +1,7 @@ #ifndef D_T_INSECT_H #define D_T_INSECT_H +#include "common.h" #include "d/a/d_a_base.h" #include "d/t/d_tg.h" #include "m/m_vec.h" @@ -48,6 +49,13 @@ public: mKillSignal = 1; } + void reveal(mVec3_c* pos) { + mRevealed = 1; + if (pos != nullptr) { + mRevealedSpawnPos = *pos; + } + } + static const f32 SCALE_X; static const f32 SCALE_Y; diff --git a/include/m/m_color.h b/include/m/m_color.h index a851f33b..0e71775b 100644 --- a/include/m/m_color.h +++ b/include/m/m_color.h @@ -7,6 +7,13 @@ struct mColor : public nw4r::ut::Color { mColor() : nw4r::ut::Color() {} mColor(int red, int green, int blue, int alpha) : nw4r::ut::Color(red, green, blue, alpha) {} mColor(int hex) : nw4r::ut::Color(hex) {} + + void operator=(GXColor& color) { + r = color.r; + g = color.g; + b = color.b; + a = color.a; + } }; #endif diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 212ac47d..0294dcca 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -277,6 +277,11 @@ public: return EGG::Vector3f::angle(other); } + void offsetWithAngle(s16 yRot, f32 scale) { + this->x += nw4r::math::SinIdx(yRot) * scale; + this->z += nw4r::math::CosIdx(yRot) * scale; + } + static mVec3_c Zero; static mVec3_c Ex; static mVec3_c Ey; diff --git a/src/REL/d/a/obj/d_a_obj_soil.cpp b/src/REL/d/a/obj/d_a_obj_soil.cpp index e1d5fa86..abb38cb9 100644 --- a/src/REL/d/a/obj/d_a_obj_soil.cpp +++ b/src/REL/d/a/obj/d_a_obj_soil.cpp @@ -1,4 +1,34 @@ #include "d/a/obj/d_a_obj_soil.h" +#include "c/c_math.h" +#include "common.h" +#include "d/a/d_a_base.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/a/d_a_player.h" +#include "d/a/obj/d_a_obj_base.h" +#include "d/a/obj/d_a_obj_tbox.h" +#include "d/col/cc/d_cc_s.h" +#include "d/d_camera.h" +#include "d/d_sc_game.h" +#include "d/d_stage_mgr.h" +#include "d/flag/sceneflag_manager.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "d/t/d_t_insect.h" +#include "f/f_base.h" +#include "f/f_manager.h" +#include "f/f_profile_name.h" +#include "m/m3d/m_smdl.h" +#include "m/m_color.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/math/math_triangular.h" +#include "rvl/GX/GXTypes.h" +#include "rvl/MTX/mtx.h" +#include "rvl/MTX/vec.h" +#include "s/s_Math.h" +#include "toBeSorted/dowsing_target.h" +#include "toBeSorted/event_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_SOIL, dAcOsoil_c, fProfile::OBJ_SOIL, 0x268, 0, 7); @@ -6,12 +36,586 @@ STATE_DEFINE(dAcOsoil_c, Soil); STATE_DEFINE(dAcOsoil_c, Hole); STATE_DEFINE(dAcOsoil_c, Ready); -void dAcOsoil_c::initializeState_Soil() {} -void dAcOsoil_c::executeState_Soil() {} +dCcD_SrcCyl dAcOsoil_c::sCylSrc = { + /* mObjInf */ + {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + /* mObjTg */ + {0, 0x111, {0, 0, 0x407}, 0, 0}, + /* mObjCo */ {0xC9}}, + /* mCylInf */ + {10.0f, 15.0f} +}; + +s32 useUnused() { + static const f32 a1[] = { + 240, + 240, + }; + static const s32 a2[] = { + 1, + 0x000F0000, + 0x459C4000, + 0x006E6950, + 0 + }; + return (s32)a1 + (s32)a2; +} + + +bool dAcOsoil_c::createHeap() { + void* data = getOarcResFile("MoundShovel"); + if (data == nullptr) { + return false; + } + mResFile = nw4r::g3d::ResFile(data); + nw4r::g3d::ResMdl mdl = mResFile.GetResMdl("MoundShovel"); + TRY_CREATE(mModels[MODEL_COVERED].create(mdl, &mAllocator, 0x120, 1, nullptr)); + mModels[MODEL_COVERED].setPriorityDraw(0x22, field_0x793 ? 0x82 : 9); + setModelColorFromParams(&mColors[MODEL_COVERED], mModels[MODEL_COVERED]); + if (isSubtypeVentOrDrop()) { + static const char* oarcResForType[4] = { + "HoleShovel", + "HoleShovel", + "MudShovel", + "MudShovel", + }; + static const char* mdlForType[4] = { + "HoleShovel", + "HoleShovel", + "MudShovel", + "MudShovel", + }; + void* subtypeData = getOarcResFile(oarcResForType[getSubtype()]); + if (subtypeData == nullptr) { + return false; + } + nw4r::g3d::ResFile subFile = nw4r::g3d::ResFile(subtypeData); + nw4r::g3d::ResMdl subMdl = subFile.GetResMdl(mdlForType[getSubtype()]); + TRY_CREATE(mModels[MODEL_DUG_UP].create(subMdl, &mAllocator, 0x120, 1, nullptr)); + mModels[MODEL_DUG_UP].setPriorityDraw(0x22, field_0x793 ? 0x82 : 9); + setModelColorFromParams(&mColors[MODEL_DUG_UP], mModels[MODEL_DUG_UP]); + } + return true; +} + +int dAcOsoil_c::actorCreate() { + mSubtype = mParams & 0xF; + if (mSubtype > 4) { + mSubtype = SUBTYPE_VENT; + } + if (mSubtype == SUBTYPE_KEY_PIECE) { + mSubtype = SUBTYPE_DROP; + mItemSubtype = ITEMTYPE_KEY_PIECE; + } else { + mItemSubtype = ITEMTYPE_DROP; + } + mSceneflag = mParams >> 4 & 0xFF; + mSpawnSceneflag = getParams2Lower() & 0xFF; + if (mSpawnSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSpawnSceneflag)) { + mIsHidden = true; + mInteractionDisabled = true; + } + if ((mParams >> 0x13 & 1) == 0 && mItemSubtype == ITEMTYPE_DROP && mSubtype != SUBTYPE_TBOX) { + mForInsects = true; + } + if (!mForInsects) { + mCountInParams = mParams >> 0xC & 0xF; + if (mCountInParams == 0) { + mCountInParams = 0xF; + } + if ((mParams >> 0x10 & 3) == 1) { + if (mItemSubtype == ITEMTYPE_DROP) { + mItemSubtype = ITEMTYPE_DIRECT_GIVE; + } + } + } else { + mCountInParams = 1; + } + mRotation.x = mAng(0); + mRotation.z = mAng(0); + if ((mParams >> 0x12 & 1) == 0) { + mDowsingStateRelated = 2; + mAlwaysLoaded = true; + } + if ((mParams >> 0x19 & 1) == 0) { + field_0x793 = true; + } + CREATE_ALLOCATOR(dAcOsoil_c); + mStts.SetRank(0); + mCollider.Set(sCylSrc); + mCollider.SetStts(mStts); + mAcceleration = 0; + mMaxSpeed = -40; + updateMatrix(); + if (isSubtypeVentOrDrop()) { + mModels[MODEL_DUG_UP].setLocalMtx(mWorldMtx); + mModels[MODEL_COVERED].setLocalMtx(mWorldMtx); + } else if (mModelIndex == MODEL_COVERED) { + mModels[MODEL_COVERED].setLocalMtx(mWorldMtx); + } + if (dScGame_c::currentSpawnInfo.stageName == "F200") { + static const mVec3_c posOnSkyloft(-7301, 3768, -9309); + if (PSVECSquareDistance(mPosition, posOnSkyloft) < 360000) { + mHideWhenCameraNear = true; + } + } + mBoundingBox.Set(mVec3_c(-100, -10, -100), mVec3_c(100, 50, 100)); + if (mAlwaysLoaded) { + s32 roomId = mRoomID; + if (addActorToRoom(-1) != 0) { + mRoomID = roomId; + changeLoadedEntitiesWithSet(); + } + } + return SUCCEEDED; +} +int dAcOsoil_c::actorPostCreate() { + if (mSubtype == SUBTYPE_TBOX) { + mStateMgr.changeState(StateID_Soil); + } else { + if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) || (mParams >> 0x18 & 1) == 0) { + mDowsingStateRelated = 0; + if (mSubtype == SUBTYPE_DROP || mSubtype == SUBTYPE_MOGMA) { + mInteractionDisabled = true; + } + mStateMgr.changeState(StateID_Hole); + } else { + mStateMgr.changeState(StateID_Soil); + } + } + if (mDowsingStateRelated == 2) { + mDowsingTarget.initialize(DowsingTarget::SLOT_QUEST, 0, nullptr, 5000); + if (mItemSubtype == ITEMTYPE_KEY_PIECE && !DowsingTarget::hasKeyPieceDowsing()) { + mDowsingStateRelated = 1; + unsetActorProperty(AC_PROP_0x1); + } else { + mDowsingTarget.doRegister(); + } + } + if (mForInsects) { + dTgInsect_c* tgInsect = nullptr; + do { + tgInsect = static_cast(fManager_c::searchBaseByProfName(fProfile::TAG_INSECT, tgInsect)); + if (tgInsect != nullptr) { + f32 dist = tgInsect->mPosition.squareDistanceToXZ(mPosition); + if (dist < 10000) { + mInsectLink.link(tgInsect); + break; + } + } + } while(tgInsect != nullptr); + } + if (mSceneflag < 0xFF && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag) && dScGame_c::currentSpawnInfo.stageName == "F401") { + mColors[MODEL_DUG_UP].a = 0xFF; + mModelIndex = MODEL_DUG_UP; + mModels[MODEL_DUG_UP].setTevColorAll(GX_TEVREG1, mColors[MODEL_DUG_UP], false); + mLightingInfo.setTev1Color(mColors[MODEL_DUG_UP]); + unsetActorProperty(AC_PROP_0x1); + mHideCover = true; + } + if (mItemSubtype == ITEMTYPE_KEY_PIECE || mItemSubtype == ITEMTYPE_DIRECT_GIVE) { + unsetActorProperty(AC_PROP_0x1); + } + // this feels fake + f32 five; + f32 posZ; + f32 newY; + f32 posX; + f32 posY; + posZ = mPosition.z; + posX = mPosition.x; + posY = mPosition.y; + five = 5; + newY = posY + five; + mPositionCopy2.x = posX; + mPositionCopy2.z = posZ; + mPositionCopy2.y = newY; + mPositionCopy3.x = posX; + mPositionCopy3.y = newY; + mPositionCopy3.z = posZ; + return SUCCEEDED; +} + + +int dAcOsoil_c::doDelete() { + if (mAlwaysLoaded) { + changeLoadedEntitiesNoSet(); + } + return SUCCEEDED; +} + +extern "C" dAcBase_c *getCurrentEventActor(); +extern "C" bool AcItem__isKeyPiece2(dAcItem_c*); +int dAcOsoil_c::actorExecute() { + if (mShouldSetFlagInEvent) { + if (EventManager::isInEvent()) { + if (EventManager::isCurrentEvent("DefaultGetItem") || EventManager::isCurrentEvent("ItemGetGorgeous")) { + if (mItemSubtype == ITEMTYPE_KEY_PIECE) { + if (AcItem__isKeyPiece2(static_cast(getCurrentEventActor()))) { + mShouldSetFlagInEvent = false; + SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); + } + } else if (mItemSubtype == ITEMTYPE_DIRECT_GIVE) { + mShouldSetFlagInEvent = false; + SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); + } + } + } + } + if (mDowsingStateRelated == 1 && DowsingTarget::hasKeyPieceDowsing()) { + mDowsingStateRelated = 2; + mDowsingTarget.doRegister(); + } + if (mIsHidden && SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSpawnSceneflag)) { + mIsHidden = false; + mInteractionDisabled = false; + } + tryLinkTbox(); + fn_255_1D80(); + handleModelsOpacities(); + mStateMgr.executeState(); + fn_255_1A50(); + if (!mInteractionDisabled) { + bool hit = false; + checkCoHit(&hit); + if (!hit && mStateMgr.isState(StateID_Soil)) { + dAcPy_c::addDigInteractionTarget(this, 240); + } + } + mCollider.SetC(mPosition); + dCcS::GetInstance()->Set(&mCollider); + return SUCCEEDED; +} + +int dAcOsoil_c::draw() { + if (mIsHidden) { + return SUCCEEDED; + } + if (isSubtypeVentOrDrop()) { + if (mStateMgr.isState(StateID_Ready)) { + if (mHideCover) { + drawModelType1(&mModels[MODEL_DUG_UP]); + } else { + drawModelType1(&mModels[MODEL_COVERED]); + drawModelType1(&mModels[MODEL_DUG_UP]); + } + } else { + drawModelType1(&mModels[mModelIndex]); + } + } else if(mModelIndex == MODEL_COVERED) { + drawModelType1(&mModels[MODEL_COVERED]); + } + return SUCCEEDED; +} + +void dAcOsoil_c::initializeState_Soil() { + mModelIndex = MODEL_COVERED; + if (mSubtype == SUBTYPE_TBOX || mItemSubtype == ITEMTYPE_KEY_PIECE || mItemSubtype == ITEMTYPE_DIRECT_GIVE) { + mDigsLeft = 1; + } else if (mCountInParams == 0xF) { + mDigsLeft = 3 + cM::rndInt(3); + } else { + mDigsLeft = mCountInParams; + } +} +void dAcOsoil_c::executeState_Soil() { + if (!checkActorProperty(AC_PROP_0x20000000) && !SceneflagManager::sInstance->checkBoolFlag(mRoomID, mSceneflag)) { + return; + } + if (mSubtype == SUBTYPE_VENT) { + bool tmp = false; + if (checkCoHit(&tmp)) { + mDigsLeft = 1; + } + } + if (mDigsLeft && --mDigsLeft) { + giveItemRepeated(); + } else { + if (mItemSubtype == ITEMTYPE_KEY_PIECE || mItemSubtype == ITEMTYPE_DIRECT_GIVE) { + mFinalDigTimer = 1; + } else if (mSubtype == SUBTYPE_VENT) { + if (mFinalDigTimer == 0) { + mFinalDigTimer = 1; + } + } else if (mSubtype == SUBTYPE_TBOX) { + if (!mInteractionDisabled) { + mInteractionDisabled = true; + mFinalDigTimer = 0xF; + } + } else if (mSubtype == SUBTYPE_DROP || mSubtype == SUBTYPE_MOGMA) { + if (!mInteractionDisabled) { + mInteractionDisabled = true; + mFinalDigTimer = 1; + } + } + if (mItemSubtype == ITEMTYPE_KEY_PIECE || mItemSubtype == ITEMTYPE_DIRECT_GIVE) { + mShouldSetFlagInEvent = true; + } else { + SceneflagManager::sInstance->setFlag(mRoomID, mSceneflag); + } + mStateMgr.changeState(StateID_Ready); + } +} void dAcOsoil_c::finalizeState_Soil() {} -void dAcOsoil_c::initializeState_Hole() {} -void dAcOsoil_c::executeState_Hole() {} +void dAcOsoil_c::initializeState_Hole() { + mModelIndex = MODEL_DUG_UP; + mCollider.OffCoSet(); + if (mItemSubtype == ITEMTYPE_KEY_PIECE || mItemSubtype == ITEMTYPE_DIRECT_GIVE) { + return; + } + setActorProperty(AC_PROP_0x1); +} +void dAcOsoil_c::executeState_Hole() { + if (checkActorProperty(AC_PROP_0x20000000)) { + if (mSceneflag < 0xFF) { + SceneflagManager::sInstance->unsetFlag(mRoomID, mSceneflag); + } + mStateMgr.changeState(StateID_Ready); + } +} void dAcOsoil_c::finalizeState_Hole() {} -void dAcOsoil_c::initializeState_Ready() {} -void dAcOsoil_c::executeState_Ready() {} -void dAcOsoil_c::finalizeState_Ready() {} +void dAcOsoil_c::initializeState_Ready() { + mInteractionDisabled = true; + if (isSubtypeVentOrDrop()) { + mMtx_c tmpMtx = mWorldMtx; + tmpMtx.transM(0, 0.2f, 0); + mModels[MODEL_COVERED].setLocalMtx(tmpMtx); + } + if (mModelIndex == MODEL_COVERED) { + mColors[MODEL_COVERED].a = 0xFF; + mModels[MODEL_COVERED].setTevColorAll(GX_TEVREG1, mColors[MODEL_COVERED], false); + mLightingInfo.setTev1Color(mColors[MODEL_COVERED]); + if (isSubtypeVentOrDrop()) { + mColors[MODEL_DUG_UP].a = 0; + mModels[MODEL_DUG_UP].setTevColorAll(GX_TEVREG1, mColors[MODEL_DUG_UP], false); + mLightingInfo.setTev1Color(mColors[MODEL_DUG_UP]); + } + } +} +void dAcOsoil_c::executeState_Ready() { + if (mModelIndex == MODEL_COVERED) { + bool bVar4 = true; + bool bVar3 = true; + bool bVar2 = true; + if (isSubtypeVentOrDrop()) { + bVar4 = sLib::chaseUC(&mColors[MODEL_DUG_UP].a, 0xFF, 0x1E); + mModels[MODEL_DUG_UP].setTevColorAll(GX_TEVREG1, mColors[MODEL_DUG_UP], false); + mLightingInfo.setTev1Color(mColors[MODEL_DUG_UP]); + if (mColors[MODEL_DUG_UP].a < 50) { + bVar3 = false; + } + } + bVar2 = false; + if (bVar3) { + bVar2 = sLib::chaseUC(&mColors[MODEL_COVERED].a, 0, 0x14); + mModels[MODEL_COVERED].setTevColorAll(GX_TEVREG1, mColors[MODEL_COVERED], false); + mLightingInfo.setTev1Color(mColors[MODEL_COVERED]); + } + if (bVar2 && bVar4) { + mStateMgr.changeState(StateID_Hole); + } + } else { + mStateMgr.changeState(StateID_Hole); + } +} +void dAcOsoil_c::finalizeState_Ready() { + if (!isSubtypeVentOrDrop()) { + return; + } + mInteractionDisabled = false; + mModels[MODEL_COVERED].setLocalMtx(mWorldMtx); +} + +void dAcOsoil_c::tryLinkTbox() { + if (mSubtype == SUBTYPE_TBOX && !mHasTriedTboxLink) { + mHasTriedTboxLink = true; + dAcTbox_c* tbox = nullptr; + f32 minDist = 100; + do { + tbox = static_cast(fManager_c::searchBaseByProfName(fProfile::TBOX, tbox)); + if (tbox != nullptr) { + f32 dist = tbox->mPosition.squareDistanceToXZ(mPosition); + if (dist < minDist) { + minDist = dist; + mTboxLink.link(tbox); + } + } + } while(tbox != nullptr); + if (mTboxLink.isLinked()) { + dAcTbox_c* tbox = mTboxLink.get(); + if (tbox->hasBeenOpened() == true) { + mStateMgr.changeState(StateID_Hole); + mInteractionDisabled = true; + } else { + tbox->setActorProperty(AC_PROP_0x40000000); + tbox->setObjectProperty(OBJ_PROP_0x200); + } + } + } +} + +void dAcOsoil_c::giveItemRepeated() { + if (!mForInsects) { + if (mItemSubtype == ITEMTYPE_KEY_PIECE) { + dAcItem_c::giveItem(ITEM_KEY_PIECE, -1, 0); + } else { + calcItemAndInsectSpawnPos(); + u32 param2NoLower = getParams2_ignoreLower(); + itemDroppingAndGivingRelated(&mItemAndInsectSpawnPos, mItemSubtype == ITEMTYPE_DIRECT_GIVE ? 4 : 1); + setParams2Upper_ignoreLower(param2NoLower); + } + } +} + +void dAcOsoil_c::giveItemFinal() { + if (mDowsingStateRelated != 0) { + if (mDowsingStateRelated == 2) { + mDowsingTarget.doUnregister(); + } + mDowsingStateRelated = 0; + } + if (!mForInsects) { + if (mItemSubtype == ITEMTYPE_KEY_PIECE) { + dAcItem_c::giveItem(ITEM_KEY_PIECE, -1, 0); + } else { + calcItemAndInsectSpawnPos(); + itemDroppingAndGivingRelated(&mItemAndInsectSpawnPos, mItemSubtype == ITEMTYPE_DIRECT_GIVE ? 4 : 1); + } + } else if (mInsectLink.isLinked()) { + calcItemAndInsectSpawnPos(); + dTgInsect_c* tgInsect = mInsectLink.get(); + tgInsect->reveal(&mItemAndInsectSpawnPos); + } +} + +void dAcOsoil_c::calcItemAndInsectSpawnPos() { + mItemAndInsectSpawnPos = mPosition; + mItemAndInsectSpawnPos.offsetWithAngle(dAcPy_c::LINK->getRotation().y, 30); +} + +void dAcOsoil_c::fn_255_1A50() { + if (mFinalDigTimer != 0 && --mFinalDigTimer == 0) { + if (mSubtype == SUBTYPE_TBOX) { + if (!mTboxPrepared && mTboxLink.isLinked()) { + dAcTbox_c* tbox = mTboxLink.get(); + tbox->unsetActorProperty(AC_PROP_0x40000000); + tbox->unsetObjectProperty(OBJ_PROP_0x200); + tbox->mRotation.y = tbox->getXZAngleToPlayer(); + mTboxPrepared = true; + } + } else { + giveItemFinal(); + } + } + if (mTboxPrepared) { + if (mTboxLink.isLinked()) { + dAcTbox_c* tbox = mTboxLink.get(); + if (tbox->mScale.x >= 1) { + mTboxPrepared = false; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_READ_RIDDLE_A); + } + } else { + mTboxPrepared = false; + } + } +} + +bool dAcOsoil_c::checkCoHit(bool* pOut) { + bool hitByWind = false; + *pOut = false; + if (mCollider.ChkCoHit()) { + dAcObjBase_c* actor = mCollider.GetCoActor(); + if (actor != nullptr && (actor->mProfileName == fProfile::OBJ_WIND || actor->mProfileName == fProfile::OBJ_WIND02 || actor->mProfileName == fProfile::OBJ_WIND03)) { + hitByWind = true; + } else { + *pOut = true; + } + } + return hitByWind; +} + +void dAcOsoil_c::setModelColorFromParams(GXColor* pOutColor, m3d::smdl_c& mdl) { + u32 param = mParams >> 0x14 & 0xF; + if (param >= 5) { + param = 0; + } + static const mColor colors[5] = { + mColor(0x6E, 0x69, 0x50, 0xFF), + mColor(0xB4, 0x8C, 0, 0xFF), + mColor(0xC8, 0x96, 0x50, 0xFF), + mColor(0x8C, 0x6E, 0x46, 0xFF), + mColor(0x8C, 0x82, 0x64, 0xFF), + }; + *pOutColor = colors[param]; + mdl.setTevColorAll(GX_TEVREG1, *pOutColor, false); + mLightingInfo.setTev1Color(*pOutColor); +} + +void dAcOsoil_c::fn_255_1D80() { + if (!field_0x793) { + return; + } + if (dAcPy_c::GetLink()->checkActionFlagsCont(0x400000)) { + mSomeCounter1 = 3; + setModelAlphaToGlobalAlpha(); + } else if (mSomeCounter1 != 0) { + mSomeCounter1--; + setModelAlphaToGlobalAlpha(); + } +} + +void dAcOsoil_c::setModelAlphaToGlobalAlpha() { + u8 globalAlpha = dStageMgr_c::GetInstance()->getGlobalAlpha(); + if (globalAlpha != mColors[mModelIndex].a) { + mColors[mModelIndex].a = globalAlpha; + mModels[mModelIndex].setTevColorAll(GX_TEVREG1, mColors[mModelIndex], false); + mLightingInfo.setTev1Color(mColors[mModelIndex]); + } +} + +// hide itself when camera is near +void dAcOsoil_c::handleModelsOpacities() { + if (!mHideWhenCameraNear) { + return; + } + if (mStateMgr.isState(StateID_Ready)) { + return; + } + if (PSVECSquareDistance(dAcPy_c::LINK->mPosition, mPosition) < 1000000) { + dCamera_c* camera = dScGame_c::getCamera(); + if (camera != nullptr) { + f32 dist = (camera->getPositionMaybe() - mPosition).y * (1.f / 80.f); + if (dist < 0.1f) { + dist = 0; + } else if (dist > 1) { + dist = 1; + } + mColors[mModelIndex].a = 255 * dist; + mModels[mModelIndex].setTevColorAll(GX_TEVREG1, mColors[mModelIndex], false); + mLightingInfo.setTev1Color(mColors[mModelIndex]); + } + } else { + if (mColors[mModelIndex].a != 0xFF) { + sLib::chaseUC(&mColors[mModelIndex].a, 0xFF, 0x32); + mModels[mModelIndex].setTevColorAll(GX_TEVREG1, mColors[mModelIndex], false); + mLightingInfo.setTev1Color(mColors[mModelIndex]); + } + } +} + +s32 moreUnusedd() { + static const s32 stuff[] = { + 0x49742400, + 0x42a00000, + 0x3c4ccccd, + 0x41f00000, + 0x42c80000, + 0x0000001e, + 0x00000014, + 0x00000032, + 0x461c4000, + 0x40a00000, + 0x48afc800 + }; + return (s32) stuff; +}