summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlepelog <25211966+lepelog@users.noreply.github.com>2025-12-08 01:27:38 +0100
committerlepelog <25211966+lepelog@users.noreply.github.com>2025-12-27 13:18:14 +0100
commitd73722da4cdb5393973f63fe5984a4f4615a4290 (patch)
tree6848d6de56d66e3e50845dcca625292ff87949bf
parent3754ad2e08d4f962f3d5f2933097db9154f1a0bc (diff)
d_a_obj_soil OK
-rw-r--r--config/SOUE01/rels/d_a_obj_soilNP/symbols.txt126
-rw-r--r--config/SOUE01/symbols.txt2
-rw-r--r--configure.py2
-rw-r--r--include/d/a/d_a_base.h1
-rw-r--r--include/d/a/d_a_player.h2
-rw-r--r--include/d/a/obj/d_a_obj_soil.h94
-rw-r--r--include/d/col/c/c_cc_d.h3
-rw-r--r--include/d/d_light_env.h5
-rw-r--r--include/d/t/d_t_insect.h8
-rw-r--r--include/m/m_color.h7
-rw-r--r--include/m/m_vec.h5
-rw-r--r--src/REL/d/a/obj/d_a_obj_soil.cpp618
12 files changed, 816 insertions, 57 deletions
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<dAcTbox_c> mTboxLink;
+ /* 0x714 */ dAcRef_c<dTgInsect_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<dTgInsect_c*>(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<dAcItem_c*>(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<dAcTbox_c*>(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;
+}