From 641a67e7c23b18b361134bc90739e5702b37a884 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Mon, 5 Feb 2024 20:48:25 -0500 Subject: [PATCH] d_bg_s_func OK --- configure.py | 2 +- include/d/d_bg_s_acch.h | 7 --- include/d/d_bg_s_func.h | 14 ++++++ include/d/d_bg_s_gnd_chk.h | 7 ++- include/d/d_bg_s_spl_grp_chk.h | 9 ++-- src/d/d_bg_s_func.cpp | 87 ++++++++++++++++++++++++++-------- 6 files changed, 89 insertions(+), 37 deletions(-) create mode 100644 include/d/d_bg_s_func.h diff --git a/configure.py b/configure.py index 777cd9574..6a66b859c 100644 --- a/configure.py +++ b/configure.py @@ -388,7 +388,7 @@ config.libs = [ Object(Matching, "d/d_att_dist.cpp"), Object(Matching, "d/d_bg_s.cpp"), Object(Matching, "d/d_bg_s_acch.cpp"), - Object(NonMatching, "d/d_bg_s_func.cpp"), + Object(Matching, "d/d_bg_s_func.cpp"), Object(Matching, "d/d_bg_s_lin_chk.cpp"), Object(Matching, "d/d_bg_s_movebg_actor.cpp"), Object(Matching, "d/d_bg_s_spl_grp_chk.cpp"), diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index b683f52e1..b77f578e5 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -74,10 +74,6 @@ public: /* 0x020000 */ SEA_CHECK = (1 << 17), /* 0x040000 */ SEA_WATER_HEIGHT = (1 << 18), /* 0x080000 */ SEA_IN = (1 << 19), - /* 0x100000 */ MOVE_BG_ONLY = (1 << 20), - /* 0x200000 */ GND_THIN_CELLING_OFF = (1 << 21), - /* 0x400000 */ WALL_SORT = (1 << 22), - /* 0x800000 */ LINE_DOWN = (1 << 23), }; dBgS_Acch(); @@ -109,8 +105,6 @@ public: for (s32 i = 0; i < m_tbl_size; i++) pm_acch_cir[i].CalcWallRR(); } - void SetMoveBGOnly(); - void ClrMoveBGOnly(); void SetGndThinCellingOff(); void ClrGndThinCellingOff(); bool ChkGndThinCellingOff(); @@ -169,7 +163,6 @@ public: void SetGrndNone() { m_flags |= GRND_NONE; } void ClrGrndNone() { m_flags &= ~GRND_NONE; } void SetGroundCheckOffset(f32 offset) { m_ground_check_offset = offset; } - bool ChkMoveBGOnly() const { return m_flags & MOVE_BG_ONLY; } void SetWallHit() { m_flags |= WALL_HIT; } void ClrWallNone() { m_flags &= ~WALL_NONE; } void OnSeaCheckOn() { m_flags |= SEA_CHECK;} diff --git a/include/d/d_bg_s_func.h b/include/d/d_bg_s_func.h new file mode 100644 index 000000000..38cb5c5f6 --- /dev/null +++ b/include/d/d_bg_s_func.h @@ -0,0 +1,14 @@ +#ifndef D_BG_S_FUNC_H +#define D_BG_S_FUNC_H + +#include "SSystem/SComponent/c_xyz.h" + +class dBgS_SplGrpChk; + +f32 dBgS_ObjGndChk_Func(cXyz&); +f32 dBgS_ObjGndChk_Wtr_Func(cXyz&); +BOOL dBgS_SplGrpChk_In_ObjGnd(cXyz&, dBgS_SplGrpChk*, f32); +f32 dBgS_GetWaterHeight(cXyz&); +u32 dBgS_GetGndMtrlSndId_Func(cXyz, f32); + +#endif /* D_BG_S_FUNC_H */ diff --git a/include/d/d_bg_s_gnd_chk.h b/include/d/d_bg_s_gnd_chk.h index dd4e7adcc..84581d28d 100644 --- a/include/d/d_bg_s_gnd_chk.h +++ b/include/d/d_bg_s_gnd_chk.h @@ -40,9 +40,12 @@ public: class dBgS_ObjGndChk_Wtr : public dBgS_ObjGndChk { public: - dBgS_ObjGndChk_Wtr(); + dBgS_ObjGndChk_Wtr() { + OffNormalGrp(); + OnWaterGrp(); + } - virtual ~dBgS_ObjGndChk_Wtr(); + virtual ~dBgS_ObjGndChk_Wtr() {} }; class dBgS_ObjGndChk_Spl : public dBgS_ObjGndChk { diff --git a/include/d/d_bg_s_spl_grp_chk.h b/include/d/d_bg_s_spl_grp_chk.h index cf0b63a09..c9eac0efe 100644 --- a/include/d/d_bg_s_spl_grp_chk.h +++ b/include/d/d_bg_s_spl_grp_chk.h @@ -10,7 +10,6 @@ public: enum { /* 0x1 */ FIND = 1, /* 0x2 */ IN = 2, - /* 0x4 */ MOVE_BG_ONLY = 4 }; dBgS_SplGrpChk(); @@ -19,15 +18,13 @@ public: virtual ~dBgS_SplGrpChk() {} void OffFind() { m_flags &= ~FIND; } - void OffIn() { m_flags &= ~IN; } - void OffMoveBGOnly() { m_flags &= ~MOVE_BG_ONLY; } - void OnMoveBGOnly() { m_flags |= MOVE_BG_ONLY; } void OnFind() { m_flags |= FIND; } - bool ChkMoveBGOnly() { return m_flags & MOVE_BG_ONLY; } + void OffIn() { m_flags &= ~IN; } + void OnIn() { m_flags |= IN; } void SetHeight(f32 height) { m_height = height; } f32 GetHeight() { return m_height; } cXyz* GetPosP() { return &m_ground; } - f32 GetRoof() const { return m_roof; } + f32 GetRoof() { return m_roof; } void Set(cXyz& ground, f32 roof) { m_ground = ground; m_roof = roof; diff --git a/src/d/d_bg_s_func.cpp b/src/d/d_bg_s_func.cpp index c31976c30..99453c300 100644 --- a/src/d/d_bg_s_func.cpp +++ b/src/d/d_bg_s_func.cpp @@ -3,39 +3,84 @@ // Translation Unit: d_bg_s_func.cpp // -#include "d_bg_s_func.h" -#include "dolphin/types.h" +#include "d/d_bg_s_func.h" +#include "d/d_bg_s_gnd_chk.h" +#include "d/d_bg_s_spl_grp_chk.h" +#include "d/d_com_inf_game.h" +#include "d/actor/d_a_sea.h" +#include "JSystem/JUtility/JUTAssert.h" /* 800A4564-800A4778 .text dBgS_ObjGndChk_Func__FR4cXyz */ -void dBgS_ObjGndChk_Func(cXyz&) { - /* Nonmatching */ +f32 dBgS_ObjGndChk_Func(cXyz& r25) { + dBgS_ObjGndChk gndChk; + gndChk.SetPos(&r25); + f32 height = dComIfG_Bgsp()->GroundCross(&gndChk); + return height; } /* 800A4778-800A49E0 .text dBgS_ObjGndChk_Wtr_Func__FR4cXyz */ -void dBgS_ObjGndChk_Wtr_Func(cXyz&) { - /* Nonmatching */ +f32 dBgS_ObjGndChk_Wtr_Func(cXyz& r19) { + dBgS_ObjGndChk_Wtr gndChk; + gndChk.SetPos(&r19); + f32 height = dComIfG_Bgsp()->GroundCross(&gndChk); + return height; } /* 800A49E0-800A4F68 .text dBgS_SplGrpChk_In_ObjGnd__FR4cXyzP14dBgS_SplGrpChkf */ -void dBgS_SplGrpChk_In_ObjGnd(cXyz&, dBgS_SplGrpChk*, float) { - /* Nonmatching */ +BOOL dBgS_SplGrpChk_In_ObjGnd(cXyz& r30, dBgS_SplGrpChk* r31, f32 f31) { + dBgS_ObjGndChk gndChk; + cXyz sp1c = r30; + sp1c.y += f31; + gndChk.SetPos(&sp1c); + f32 height = dComIfG_Bgsp()->GroundCross(&gndChk); + r31->SetHeight(height); + if (height == -1e9f) { + return FALSE; + } + + int room_no = dComIfG_Bgsp()->GetRoomId(gndChk); + JUT_ASSERT(93, 0 <= room_no && room_no < 64); + dBgW* bgw = dComIfGp_roomControl_getBgW(room_no); + if (bgw == NULL) { + return FALSE; + } + + f32 max, min; + bgw->GetTopUnder(&max, &min); + cXyz sp10 = r30; + sp10.y = height; + r31->Set(sp10, max); + if (dComIfG_Bgsp()->SplGrpChk(r31)) { + if (r31->GetHeight() > r30.y) { + r31->OnIn(); + } + return TRUE; + } else { + return FALSE; + } } /* 800A4F68-800A51FC .text dBgS_GetWaterHeight__FR4cXyz */ -void dBgS_GetWaterHeight(cXyz&) { - /* Nonmatching */ +f32 dBgS_GetWaterHeight(cXyz& r19) { + dBgS_ObjGndChk_Wtr gndChk; + gndChk.SetPos(&r19); + f32 height = dComIfG_Bgsp()->GroundCross(&gndChk); + if (daSea_ChkArea(r19.x, r19.z)) { + f32 f1 = daSea_calcWave(r19.x, r19.z); + if (height < f1) { + height = f1; + } + } + return height; } /* 800A51FC-800A54F8 .text dBgS_GetGndMtrlSndId_Func__F4cXyzf */ -void dBgS_GetGndMtrlSndId_Func(cXyz, float) { - /* Nonmatching */ +u32 dBgS_GetGndMtrlSndId_Func(cXyz r21, f32 f1) { + r21.y += f1; + dBgS_ObjGndChk gndChk; + gndChk.SetPos(&r21); + if (dComIfG_Bgsp()->GroundCross(&gndChk) == -1e9f) { + return 0; + } + return dComIfG_Bgsp()->GetMtrlSndId(gndChk); } - -/* 800A54F8-800A5660 .text __dt__18dBgS_ObjGndChk_WtrFv */ -dBgS_ObjGndChk_Wtr::~dBgS_ObjGndChk_Wtr() { - /* Nonmatching */ -} - - - -