diff --git a/include/SSystem/SComponent/c_bg_s_shdw_draw.h b/include/SSystem/SComponent/c_bg_s_shdw_draw.h index e99a933b702..9ec30233069 100644 --- a/include/SSystem/SComponent/c_bg_s_shdw_draw.h +++ b/include/SSystem/SComponent/c_bg_s_shdw_draw.h @@ -20,6 +20,9 @@ class cBgS_ShdwDraw : public cBgS_Chk { /* 0x14 */ cM3dGAab mM3dGAab; /* 0x30 */ cBgS_ShdwDraw_Callback mCallbackFun; + #if DEBUG + /* 0x34 */ int field_0x34; + #endif }; #endif /* C_BG_S_SHDW_DRAW_H */ diff --git a/include/SSystem/SComponent/c_bg_w.h b/include/SSystem/SComponent/c_bg_w.h index f1d5e291b4e..23c6747d15f 100644 --- a/include/SSystem/SComponent/c_bg_w.h +++ b/include/SSystem/SComponent/c_bg_w.h @@ -18,7 +18,7 @@ class cBgW_BgId { cBgW_BgId() { Ct(); } void Ct() { m_id = 0x100; } - u16 GetId() const { return m_id; } + int GetId() const { return m_id; } }; bool cBgW_CheckBGround(float a1); diff --git a/include/SSystem/SComponent/c_m3d_g_aab.h b/include/SSystem/SComponent/c_m3d_g_aab.h index 6317065a310..b070e776ebc 100644 --- a/include/SSystem/SComponent/c_m3d_g_aab.h +++ b/include/SSystem/SComponent/c_m3d_g_aab.h @@ -35,16 +35,16 @@ class cM3dGAab { const f32 GetMinX(void) const { return mMin.x; } const f32 GetMinY(void) const { return mMin.y; } const f32 GetMinZ(void) const { return mMin.z; } - bool Cross(const cM3dGLin *param_1) { + bool Cross(const cM3dGLin *param_1) const { return cM3d_Cross_MinMaxBoxLine(GetMinP(), GetMaxP(), (Vec*)¶m_1->GetStartP(), (Vec*)¶m_1->GetEndP()); } - bool Cross(const cM3dGAab *param_1) { + bool Cross(const cM3dGAab *param_1) const { return cM3d_Cross_AabAab(this, param_1); } - bool Cross(const cM3dGCyl *param_1) { + bool Cross(const cM3dGCyl *param_1) const { return cM3d_Cross_AabCyl(this, param_1); } - bool Cross(const cM3dGSph *param_1) { + bool Cross(const cM3dGSph *param_1) const { return cM3d_Cross_AabSph(this, param_1); } }; // Size = 0x1C diff --git a/include/SSystem/SComponent/c_m3d_g_cir.h b/include/SSystem/SComponent/c_m3d_g_cir.h index eccd553c86a..af837d47d6d 100644 --- a/include/SSystem/SComponent/c_m3d_g_cir.h +++ b/include/SSystem/SComponent/c_m3d_g_cir.h @@ -30,6 +30,8 @@ class cM3dGCir : public cM2dGCir { cM3dGCir(void); virtual ~cM3dGCir(void); void Set(f32, f32, f32, f32); + + f32 GetHeight() const { return mPosZ; } }; #endif /* C_M3D_G_CIR_H */ diff --git a/include/SSystem/SComponent/c_m3d_g_pla.h b/include/SSystem/SComponent/c_m3d_g_pla.h index 7f25724b551..e2b0eefb552 100644 --- a/include/SSystem/SComponent/c_m3d_g_pla.h +++ b/include/SSystem/SComponent/c_m3d_g_pla.h @@ -31,8 +31,8 @@ class cM3dGPla { cM3d_CalcPla(v1, v2, v3, &mNormal, &mD); } - f32 getCrossY_NonIsZero(const cXyz *param_1) { - return ((-mNormal.x * param_1->x - mNormal.z * param_1->z) - mD) / mNormal.y; + f32 getCrossY_NonIsZero(const cXyz& param_1) const { + return ((-mNormal.x * param_1.x - mNormal.z * param_1.z) - mD) / mNormal.y; } bool cross(cM3dGLin const& line, Vec& point) { diff --git a/include/d/d_bg_s.h b/include/d/d_bg_s.h index 315a7be614e..1c47356c80c 100644 --- a/include/d/d_bg_s.h +++ b/include/d/d_bg_s.h @@ -13,7 +13,7 @@ class cBgS_ChkElm { public: /* 0x00 */ dBgW_Base* m_bgw_base_ptr; /* 0x04 */ bool m_used; - /* 0x08 */ u32 m_actor_id; + /* 0x08 */ fpc_ProcID m_actor_id; /* 0x0C */ fopAc_ac_c* m_actor_ptr; /* 0x10 vtable */ @@ -50,6 +50,7 @@ class cBgS { bool GetTriPnt(cBgS_PolyInfo const&, cXyz*, cXyz*, cXyz*) const; void ShdwDraw(cBgS_ShdwDraw*); u32 GetGrpInf(cBgS_PolyInfo const&) const; + void Draw(); virtual ~cBgS() {} virtual void Ct(); @@ -67,40 +68,124 @@ u8 dKy_pol_sound_get(cBgS_PolyInfo const* param_0); class dBgS_HIO : public JORReflexible { public: #if DEBUG + enum flags_e { + FLAG_ACCH_WALL_OFF_e = 0x2, + FLAG_CHECK_COUNTER_e = 0x4, + FLAG_ACCH_WALL_TIMER_e = 0x8, + FLAG_OBJ_LINE_CHECK_e = 0x10, + FLAG_ACCH_DRAW_WALL_e = 0x400, + FLAG_ROOF_TIMER_e = 0x2000, + FLAG_ROOF_OFF_e = 0x4000, + + FLAG2_GND_CHK_e = 0x1, + FLAG2_SHAPE_DISP_e = 0x2, + FLAG2_GROUND_CHECK_TIMER_e = 0x4, + FLAG2_SPL_OFF_e = 0x8, + FLAG2_SPL_TIMER_e = 0x10, + FLAG2_LINE_OFF_e = 0x40, + FLAG2_LINE_TIMER_e = 0x80, + FLAG2_SHDW_DRAW_OFF_e = 0x100, + FLAG2_SHDW_DRAW_TIMER_e = 0x200, + FLAG2_CAPTPOLY_OFF_e = 0x800, + FLAG2_CAPTPOLY_TIMER_e = 0x1000, + FLAG2_SPH_CHK_OFF_e = 0x2000, + FLAG2_SPH_CHK_TIMER_e = 0x4000, + }; + dBgS_HIO() { - field_0x6 = 0; - field_0x8 = 0; + m_flags = 0; + m_flags2 = 0; - field_0xc.x = field_0xc.y = field_0xc.z = 0.0f; - field_0x18.x = field_0x18.y = field_0x18.z = 0.0f; - field_0x24.x = field_0x24.y = field_0x24.z = 0.0f; + m_linecheck_start.x = m_linecheck_start.y = m_linecheck_start.z = 0.0f; + m_linecheck_end.x = m_linecheck_end.y = m_linecheck_end.z = 0.0f; + m_gndcheck_pos.x = m_gndcheck_pos.y = m_gndcheck_pos.z = 0.0f; - field_0x30 = -1; + m_errorCheck_actor_num = -1; } virtual void genMessage(JORMContext*); virtual ~dBgS_HIO(); - BOOL ChkLineOff(); - BOOL ChkCheckCounter(); - BOOL ChkLineTimer(); - BOOL ChkGroundCheckTimer(); - - /* 0x04 */ u8 field_0x4[0x6 - 0x4]; - /* 0x06 */ u16 field_0x6; - /* 0x08 */ u16 field_0x8; - /* 0x0C */ cXyz field_0xc; - /* 0x18 */ cXyz field_0x18; - /* 0x24 */ cXyz field_0x24; - /* 0x30 */ int field_0x30; + bool ChkLineOff() { return m_flags2 & FLAG2_LINE_OFF_e; } + bool ChkCheckCounter() { return m_flags & FLAG_CHECK_COUNTER_e; } + bool ChkLineTimer() { return m_flags2 & FLAG2_LINE_TIMER_e; } + bool ChkGroundCheckTimer() { return m_flags2 & FLAG2_GROUND_CHECK_TIMER_e; } + bool ChkObjLineCheck() { return m_flags & FLAG_OBJ_LINE_CHECK_e; } + bool ChkGndCheck() { return m_flags2 & FLAG2_GND_CHK_e; } + bool ChkCaptPolyTimer() { return m_flags2 & FLAG2_CAPTPOLY_TIMER_e; } + bool ChkCaptPolyOff() { return m_flags2 & FLAG2_CAPTPOLY_OFF_e; } + bool ChkShdwDrawOff() { return m_flags2 & FLAG2_SHDW_DRAW_OFF_e; } + bool ChkShdwDrawTimer() { return m_flags2 & FLAG2_SHDW_DRAW_TIMER_e; } + bool ChkAcchWallOff() { return m_flags & FLAG_ACCH_WALL_OFF_e; } + bool ChkAcchWallTimer() { return m_flags & FLAG_ACCH_WALL_TIMER_e; } + bool ChkRoofTimer() { return m_flags & FLAG_ROOF_TIMER_e; } + bool ChkRoofOff() { return m_flags & FLAG_ROOF_OFF_e; } + bool ChkSplOff() { return m_flags2 & FLAG2_SPL_OFF_e; } + bool ChkSplTimer() { return m_flags2 & FLAG2_SPL_TIMER_e; } + bool ChkSphChkOff() { return m_flags2 & FLAG2_SPH_CHK_OFF_e; } + bool ChkSphChkTimer() { return m_flags2 & FLAG2_SPH_CHK_TIMER_e; } + bool ChkShapeDisp() { return m_flags2 & FLAG2_SHAPE_DISP_e; } + bool ChkAcchDrawWall() { return m_flags & FLAG_ACCH_DRAW_WALL_e; } + + /* 0x04 */ s8 id; + /* 0x06 */ u16 m_flags; + /* 0x08 */ u16 m_flags2; + /* 0x0C */ cXyz m_linecheck_start; + /* 0x18 */ cXyz m_linecheck_end; + /* 0x24 */ cXyz m_gndcheck_pos; + /* 0x30 */ s32 m_errorCheck_actor_num; #endif }; -extern int g_line_counter; -extern OSStopwatch s_line_sw; +class dBgS_InsideHIO : public JORReflexible { +public: +#if DEBUG + enum flags_e { + FLAG_DISP_POLY_e = 0x1, + FLAG_DISP_DP_AREA_e = 0x2, + FLAG_WHITE_WIRE_e = 0x4, + FLAG_PLAYER_AROUND_e = 0x8, + FLAG_DISP_WATER_POLY_e = 0x10, + FLAG_GROUND_OFF_e = 0x20, + FLAG_WALL_OFF_e = 0x40, + FLAG_ROOF_OFF_e = 0x80, + FLAG_GNDCHK_PLAYER_UNDER_e = 0x100, + }; + + dBgS_InsideHIO() { + m_flags = FLAG_PLAYER_AROUND_e; + + m_raise_amount = 1.0f; -extern int g_ground_counter; -extern OSStopwatch s_ground_sw; + m_p0.x = 100.0f; + m_p0.y = 0.0f; + m_p0.z = 0.0f; + + m_p1.x = 0.0f; + m_p1.y = 0.0f; + m_p1.z = 0.0f; + } + + virtual void genMessage(JORMContext*); + virtual ~dBgS_InsideHIO(); + + BOOL ChkWallOff() { return m_flags & FLAG_WALL_OFF_e; } + BOOL ChkRoofOff() { return m_flags & FLAG_ROOF_OFF_e; } + BOOL ChkGroundOff() { return m_flags & FLAG_GROUND_OFF_e; } + BOOL ChkGndChkPlayerUnder() { return m_flags & FLAG_GNDCHK_PLAYER_UNDER_e; } + BOOL ChkWhiteWire() { return m_flags & FLAG_WHITE_WIRE_e; } + BOOL ChkDispWaterPoly() { return m_flags & FLAG_DISP_WATER_POLY_e; } + BOOL ChkDispDpArea() { return m_flags & FLAG_DISP_DP_AREA_e; } + BOOL ChkPlayerAround() { return m_flags & FLAG_PLAYER_AROUND_e; } + BOOL ChkDispPoly() { return m_flags & FLAG_DISP_POLY_e; } + + /* 0x04 */ s8 id; + /* 0x06 */ u16 m_flags; + /* 0x08 */ f32 m_raise_amount; + /* 0x0C */ cXyz m_p0; + /* 0x18 */ cXyz m_p1; +#endif +}; class dBgS : public cBgS { public: @@ -149,53 +234,31 @@ class dBgS : public cBgS { bool WaterChk(dBgS_SplGrpChk* chk) { return SplGrpChk(chk); } u32 GetMtrlSndId(const cBgS_PolyInfo& param_0) { return dKy_pol_sound_get(¶m_0); } - void DebugDrawPoly(dBgW_Base *param_1) {} - void DebugDrawPoly(dBgW_Base const& param_1) {} void DrawPoly(cBgS_PolyInfo const& param_0, GXColor const& param_1); fopAc_ac_c* GetActorPointer(cBgS_PolyInfo const& param_0) const { return cBgS::GetActorPointer(param_0); } + + #if DEBUG + void DebugDrawPoly(const dBgW_Base& param_1); + #endif + + #if DEBUG + bool LineCross(cBgS_LinChk* i_linChk); + f32 GroundCross(cBgS_GndChk* i_gndChk); + void ShdwDraw(cBgS_ShdwDraw*); + #else bool LineCross(cBgS_LinChk* i_linChk) { - #if DEBUG - if (m_hio.ChkLineOff()) { - return false; - } - if (m_hio.ChkCheckCounter()) { - g_line_counter++; - } - if (m_hio.ChkLineTimer()) { - OSStartStopwatch(&s_line_sw); - } - bool rt = cBgS::LineCross(i_linChk); - if (m_hio.ChkLineTimer()) { - OSStopStopwatch(&s_line_sw); - OSDumpStopwatch(&s_line_sw); - } - return rt; - #else return cBgS::LineCross(i_linChk); - #endif } + f32 GroundCross(cBgS_GndChk* i_gndChk) { - #if DEBUG - if (m_hio.ChkCheckCounter()) { - g_ground_counter++; - } - if (m_hio.ChkGroundCheckTimer()) { - OSStartStopwatch(&s_ground_sw); - } - f32 rt = cBgS::GroundCross(i_gndChk); - if (m_hio.ChkGroundCheckTimer()) { - OSStopStopwatch(&s_ground_sw); - OSDumpStopwatch(&s_ground_sw); - } - return rt; - #else return cBgS::GroundCross(i_gndChk); - #endif } + #endif void ChkDeleteActorRegist(fopAc_ac_c*); void Draw(); + void CaptPoly(dBgS_CaptPoly&); #if DEBUG /* 0x1404 */ u8 field_0x1404[0x1408 - 0x1404]; diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 4f97961dde9..33bca24c0a3 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -25,7 +25,7 @@ class dBgS_AcchCir : public cBgS_PolyInfo { public: enum { - /* 0x2 */ WALL_HIT = 2, + /* 0x2 */ FLAG_WALL_HIT = 2, /* 0x4 */ WALL_H_DIRECT = 4, }; @@ -42,16 +42,18 @@ class dBgS_AcchCir : public cBgS_PolyInfo { virtual ~dBgS_AcchCir() {} #endif + void SetWallPolyIndex(int index) { SetPolyIndex(index); } + f32 GetWallH() { return m_wall_h; } f32 GetWallR() { return m_wall_r; } void SetWallH(f32 h) { m_wall_h = h; } void ClrWallHDirect() { m_flags &= ~WALL_H_DIRECT; } - bool ChkWallHit() { return (m_flags & WALL_HIT) != 0; } + bool ChkWallHit() { return (m_flags & FLAG_WALL_HIT) != 0; } s16 GetWallAngleY() { return m_wall_angle_y; } - bool ChkWallHDirect() { return (m_flags & WALL_H_DIRECT) != 0; } + BOOL ChkWallHDirect() { return (m_flags & WALL_H_DIRECT); } f32 GetWallHDirect() { return m_wall_h_direct; } f32 GetWallRR() { return m_wall_rr; } - void SetWallHit() { m_flags |= WALL_HIT; } + void SetWallHit() { m_flags |= FLAG_WALL_HIT; } void SetWallAngleY(s16 i_angle) { m_wall_angle_y = i_angle; } cM3dGCir* GetCirP() { return &m_cir; } @@ -62,26 +64,26 @@ class dBgS; class dBgS_Acch : public cBgS_Chk, public dBgS_Chk { public: enum { - /* 0x000002 */ GRND_NONE = (1 << 1), - /* 0x000004 */ WALL_NONE = (1 << 2), - /* 0x000008 */ ROOF_NONE = (1 << 3), - /* 0x000010 */ WALL_HIT = (1 << 4), - /* 0x000020 */ GROUND_HIT = (1 << 5), - /* 0x000040 */ GROUND_FIND = (1 << 6), - /* 0x000080 */ GROUND_LANDING = (1 << 7), - /* 0x000100 */ GROUND_AWAY = (1 << 8), - /* 0x000200 */ ROOF_HIT = (1 << 9), - /* 0x000400 */ WATER_NONE = (1 << 10), - /* 0x000800 */ WATER_HIT = (1 << 11), - /* 0x001000 */ WATER_IN = (1 << 12), - /* 0x002000 */ LINE_CHECK = (1 << 13), - /* 0x004000 */ LINE_CHECK_NONE = (1 << 14), - /* 0x008000 */ CLR_SPEED_Y = (1 << 15), - /* 0x010000 */ LINE_CHECK_HIT = (1 << 16), - /* 0x100000 */ MOVE_BG_ONLY = (1 << 20), - /* 0x200000 */ GND_THIN_CELLING_OFF = (1 << 21), - /* 0x400000 */ WALL_SORT = (1 << 22), - /* 0x800000 */ LINE_DOWN = (1 << 23), + /* 0x000002 */ FLAG_GRND_NONE = (1 << 1), + /* 0x000004 */ FLAG_WALL_NONE = (1 << 2), + /* 0x000008 */ FLAG_ROOF_NONE = (1 << 3), + /* 0x000010 */ FLAG_WALL_HIT = (1 << 4), + /* 0x000020 */ FLAG_GROUND_HIT = (1 << 5), + /* 0x000040 */ FLAG_GROUND_FIND = (1 << 6), + /* 0x000080 */ FLAG_GROUND_LANDING = (1 << 7), + /* 0x000100 */ FLAG_GROUND_AWAY = (1 << 8), + /* 0x000200 */ FLAG_ROOF_HIT = (1 << 9), + /* 0x000400 */ FLAG_WATER_NONE = (1 << 10), + /* 0x000800 */ FLAG_WATER_HIT = (1 << 11), + /* 0x001000 */ FLAG_WATER_IN = (1 << 12), + /* 0x002000 */ FLAG_LINE_CHECK = (1 << 13), + /* 0x004000 */ FLAG_LINE_CHECK_NONE = (1 << 14), + /* 0x008000 */ FLAG_CLR_SPEED_Y = (1 << 15), + /* 0x010000 */ FLAG_LINE_CHECK_HIT = (1 << 16), + /* 0x100000 */ FLAG_MOVE_BG_ONLY = (1 << 20), + /* 0x200000 */ FLAG_GND_THIN_CELLING_OFF = (1 << 21), + /* 0x400000 */ FLAG_WALL_SORT = (1 << 22), + /* 0x800000 */ FLAG_LINE_DOWN = (1 << 23), }; dBgS_Acch(); @@ -124,56 +126,56 @@ class dBgS_Acch : public cBgS_Chk, public dBgS_Chk { f32 GetRoofHeight() const { return m_roof_height; } int GetTblSize() { return m_tbl_size; } void SetLin() { m_lin.SetStartEnd(*pm_old_pos, *pm_pos); } - bool ChkGroundFind() { return (m_flags & GROUND_FIND) != 0; } - bool ChkGroundHit() const { return (m_flags & GROUND_HIT) != 0; } - bool ChkGroundLanding() const { return (m_flags & GROUND_LANDING) != 0; } - void ClrGroundLanding() { m_flags &= ~GROUND_LANDING; } - void ClrGroundAway() { m_flags &= ~GROUND_AWAY; } - void ClrWallHit() { m_flags &= ~WALL_HIT; } - void SetRoofNone() { m_flags |= ROOF_NONE; } - void SetRoofHit() { m_flags |= ROOF_HIT; } - void SetWaterNone() { m_flags |= WATER_NONE; } - u32 ChkWallHit() const { return m_flags & WALL_HIT; } - void OffLineCheckHit() { m_flags &= ~LINE_CHECK_HIT; } - void OffLineCheck() { m_flags &= ~LINE_CHECK; } - u32 ChkLineCheckNone() const { return (m_flags & LINE_CHECK_NONE) != 0; } - u32 ChkLineCheck() const { return (m_flags & LINE_CHECK) != 0; } - void ClrRoofHit() { m_flags &= ~ROOF_HIT; } - void ClrWaterHit() { m_flags &= ~WATER_HIT; } - void SetWaterHit() { m_flags |= WATER_HIT; } - void ClrWaterIn() { m_flags &= ~WATER_IN; } - void SetWaterIn() { m_flags |= WATER_IN; } - const u32 MaskWaterIn() const { return m_flags & WATER_IN; } + bool ChkGroundFind() { return (m_flags & FLAG_GROUND_FIND) != 0; } + bool ChkGroundHit() const { return (m_flags & FLAG_GROUND_HIT) != 0; } + bool ChkGroundLanding() const { return (m_flags & FLAG_GROUND_LANDING) != 0; } + void ClrGroundLanding() { m_flags &= ~FLAG_GROUND_LANDING; } + void ClrGroundAway() { m_flags &= ~FLAG_GROUND_AWAY; } + void ClrWallHit() { m_flags &= ~FLAG_WALL_HIT; } + void SetRoofNone() { m_flags |= FLAG_ROOF_NONE; } + void SetRoofHit() { m_flags |= FLAG_ROOF_HIT; } + void SetWaterNone() { m_flags |= FLAG_WATER_NONE; } + u32 ChkWallHit() const { return m_flags & FLAG_WALL_HIT; } + void OffLineCheckHit() { m_flags &= ~FLAG_LINE_CHECK_HIT; } + void OffLineCheck() { m_flags &= ~FLAG_LINE_CHECK; } + u32 ChkLineCheckNone() const { return (m_flags & FLAG_LINE_CHECK_NONE); } + u32 ChkLineCheck() const { return (m_flags & FLAG_LINE_CHECK); } + void ClrRoofHit() { m_flags &= ~FLAG_ROOF_HIT; } + void ClrWaterHit() { m_flags &= ~FLAG_WATER_HIT; } + void SetWaterHit() { m_flags |= FLAG_WATER_HIT; } + void ClrWaterIn() { m_flags &= ~FLAG_WATER_IN; } + void SetWaterIn() { m_flags |= FLAG_WATER_IN; } + const u32 MaskWaterIn() const { return m_flags & FLAG_WATER_IN; } const bool ChkWaterIn() const { return MaskWaterIn() != 0; } - void ClrGroundFind() { m_flags &= ~GROUND_FIND; } - u32 MaskRoofHit() const { return m_flags & ROOF_HIT; } + void ClrGroundFind() { m_flags &= ~FLAG_GROUND_FIND; } + u32 MaskRoofHit() const { return m_flags & FLAG_ROOF_HIT; } bool ChkRoofHit() const { return MaskRoofHit() != 0; } - void OffClrSpeedY() { m_flags |= CLR_SPEED_Y; } - void OnClrSpeedY() { m_flags &= ~CLR_SPEED_Y; } - bool ChkClrSpeedY() const { return !(m_flags & CLR_SPEED_Y); } - void SetGroundFind() { m_flags |= GROUND_FIND; } - void SetGroundHit() { m_flags |= GROUND_HIT; } - void SetGroundLanding() { m_flags |= GROUND_LANDING; } - void SetGroundAway() { m_flags |= GROUND_AWAY; } - const u32 MaskWaterHit() const { return m_flags & WATER_HIT; } + void OffClrSpeedY() { m_flags |= FLAG_CLR_SPEED_Y; } + void OnClrSpeedY() { m_flags &= ~FLAG_CLR_SPEED_Y; } + bool ChkClrSpeedY() const { return !(m_flags & FLAG_CLR_SPEED_Y); } + void SetGroundFind() { m_flags |= FLAG_GROUND_FIND; } + void SetGroundHit() { m_flags |= FLAG_GROUND_HIT; } + void SetGroundLanding() { m_flags |= FLAG_GROUND_LANDING; } + void SetGroundAway() { m_flags |= FLAG_GROUND_AWAY; } + const u32 MaskWaterHit() const { return m_flags & FLAG_WATER_HIT; } const bool ChkWaterHit() const { return MaskWaterHit() != 0; } - void ClrWaterNone() { m_flags &= ~WATER_NONE; } + void ClrWaterNone() { m_flags &= ~FLAG_WATER_NONE; } void SetWaterCheckOffset(f32 offset) { m_wtr_chk_offset = offset; } - void OnLineCheck() { m_flags |= LINE_CHECK; } - void ClrRoofNone() { m_flags &= ~ROOF_NONE; } + void OnLineCheck() { m_flags |= FLAG_LINE_CHECK; } + void ClrRoofNone() { m_flags &= ~FLAG_ROOF_NONE; } void SetRoofCrrHeight(f32 height) { m_roof_crr_height = height; } void SetWtrChkMode(int mode) { m_wtr_mode = mode; } - void SetGrndNone() { m_flags |= GRND_NONE; } - void ClrGrndNone() { m_flags &= ~GRND_NONE; } - bool ChkMoveBGOnly() const { return (m_flags & MOVE_BG_ONLY) != 0; } - void SetWallHit() { m_flags |= WALL_HIT; } - void ClrWallNone() { m_flags &= ~WALL_NONE; } - void OnLineCheckNone() { m_flags |= LINE_CHECK_NONE; } - void OffLineCheckNone() { m_flags &= ~LINE_CHECK_NONE; } - void SetWallNone() { m_flags |= WALL_NONE; } - void OnLineCheckHit() { m_flags |= LINE_CHECK_HIT; } - bool ChkGroundAway() const { return (m_flags & GROUND_AWAY) != 0; } - void ClrGroundHit() { m_flags &= ~GROUND_HIT; } + void SetGrndNone() { m_flags |= FLAG_GRND_NONE; } + void ClrGrndNone() { m_flags &= ~FLAG_GRND_NONE; } + bool ChkMoveBGOnly() const { return (m_flags & FLAG_MOVE_BG_ONLY) != 0; } + void SetWallHit() { m_flags |= FLAG_WALL_HIT; } + void ClrWallNone() { m_flags &= ~FLAG_WALL_NONE; } + void OnLineCheckNone() { m_flags |= FLAG_LINE_CHECK_NONE; } + void OffLineCheckNone() { m_flags &= ~FLAG_LINE_CHECK_NONE; } + void SetWallNone() { m_flags |= FLAG_WALL_NONE; } + void OnLineCheckHit() { m_flags |= FLAG_LINE_CHECK_HIT; } + bool ChkGroundAway() const { return (m_flags & FLAG_GROUND_AWAY) != 0; } + void ClrGroundHit() { m_flags &= ~FLAG_GROUND_HIT; } void SetGroundCheckOffset(f32 offset) { m_gnd_chk_offset = offset; } cM3dGCyl* GetWallBmdCylP() { return &m_wall_cyl; } @@ -186,7 +188,7 @@ class dBgS_Acch : public cBgS_Chk, public dBgS_Chk { f32 GetWallH(int i_no) { return pm_acch_cir[i_no].GetWallH(); } f32 GetWallR(int i_no) { return pm_acch_cir[i_no].GetWallR(); } - bool ChkWallHDirect(int i_no) { return pm_acch_cir[i_no].ChkWallHDirect(); } + BOOL ChkWallHDirect(int i_no) { return pm_acch_cir[i_no].ChkWallHDirect(); } f32 GetWallHDirect(int i_no) { return pm_acch_cir[i_no].GetWallHDirect(); } f32 GetWallRR(int i_no) { return pm_acch_cir[i_no].GetWallRR(); } void SetWallCirHit(int i_no) { pm_acch_cir[i_no].SetWallHit(); } diff --git a/include/d/d_bg_s_cap_poly.h b/include/d/d_bg_s_cap_poly.h deleted file mode 100644 index ca4a38542c1..00000000000 --- a/include/d/d_bg_s_cap_poly.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef D_BG_D_BG_S_CAPT_POLY_H -#define D_BG_D_BG_S_CAPT_POLY_H - -#include "d/d_bg_s_chk.h" -#include "SSystem/SComponent/c_m3d_g_aab.h" - -class dBgS_CaptPoly; - -typedef void (*CaptPolyCallback)(dBgS_CaptPoly&, cBgD_Vtx_t*, u16, u16, u16, cM3dGPla*); - -struct dBgS_CaptPoly : public cBgS_Chk, public dBgS_Chk { -public: - cM3dGAab* GetBndP() { return &m_pos;} - - /* 0x2C */ cM3dGAab m_pos; - /* 0x48 */ CaptPolyCallback m_callback; -}; - -#endif diff --git a/include/d/d_bg_s_capt_poly.h b/include/d/d_bg_s_capt_poly.h index 69a36ce247a..9e61d74336a 100644 --- a/include/d/d_bg_s_capt_poly.h +++ b/include/d/d_bg_s_capt_poly.h @@ -1,18 +1,24 @@ -#ifndef _D_BG_S_CAPT_POLY_H -#define _D_BG_S_CAPT_POLY_H +#ifndef D_BG_D_BG_S_CAPT_POLY_H +#define D_BG_D_BG_S_CAPT_POLY_H #include "d/d_bg_s_chk.h" #include "SSystem/SComponent/c_m3d_g_aab.h" -#include "SSystem/SComponent/c_xyz.h" -class dBgS_CaptPoly : public cBgS_Chk, public dBgS_Chk { +struct dBgS_CaptPoly; + +typedef int (*CaptPolyCallback)(dBgS_CaptPoly*, cBgD_Vtx_t*, int, int, int, cM3dGPla*); + +struct dBgS_CaptPoly : public cBgS_Chk, public dBgS_Chk { public: dBgS_CaptPoly(); ~dBgS_CaptPoly() {} void Set(cXyz&, cXyz&); - /* 0x24 */ cM3dGAab aab; - /* 0x48 */ int field_0x48; + void SetCallback(CaptPolyCallback callback) { m_callback = callback; } + cM3dGAab* GetBndP() { return &m_bnd;} + + /* 0x2C */ cM3dGAab m_bnd; + /* 0x48 */ CaptPolyCallback m_callback; }; -#endif /* _D_BG_S_CAPT_POLY_H */ +#endif diff --git a/include/d/d_bg_s_grp_pass_chk.h b/include/d/d_bg_s_grp_pass_chk.h index c58300e68b5..eea3414b986 100644 --- a/include/d/d_bg_s_grp_pass_chk.h +++ b/include/d/d_bg_s_grp_pass_chk.h @@ -20,6 +20,7 @@ class dBgS_GrpPassChk : public cBgS_GrpPassChk { void OffWaterGrp() { mGrp &= ~WATER_GRP; } void OnNormalGrp() { mGrp |= NORMAL_GRP; } void OffNormalGrp() { mGrp &= ~NORMAL_GRP; } + void OnFullGrp() { mGrp |= FULL_GRP; } void OffFullGrp() { mGrp &= ~FULL_GRP; } void OnAll() { mGrp |= FULL_GRP; } u32 MaskNormalGrp() { return mGrp & NORMAL_GRP; } diff --git a/include/d/d_bg_s_sph_chk.h b/include/d/d_bg_s_sph_chk.h index a7734563c60..200a46d89bc 100644 --- a/include/d/d_bg_s_sph_chk.h +++ b/include/d/d_bg_s_sph_chk.h @@ -15,6 +15,7 @@ class dBgS_SphChk : public cM3dGSph, public cBgS_PolyInfo, public cBgS_Chk, publ dBgS_SphChk(); virtual ~dBgS_SphChk(); + void Init() { ClearPi(); } void SetCallback(SphChk_Callback i_callback) { mCallback = i_callback; } /* 0x50 */ SphChk_Callback mCallback; diff --git a/include/d/d_bg_s_spl_grp_chk.h b/include/d/d_bg_s_spl_grp_chk.h index bc8567eec57..447bbf4d73a 100644 --- a/include/d/d_bg_s_spl_grp_chk.h +++ b/include/d/d_bg_s_spl_grp_chk.h @@ -24,7 +24,7 @@ class dBgS_SplGrpChk : public cBgS_PolyInfo, public cBgS_Chk, public dBgS_Chk { 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; } + BOOL ChkMoveBGOnly() { return m_flags & MOVE_BG_ONLY; } void SetHeight(f32 height) { m_height = height; } f32 GetHeight() { return m_height; } cXyz& GetPosP() { return m_ground; } diff --git a/include/d/d_bg_w.h b/include/d/d_bg_w.h index 09970f9f4dc..592ae177a5b 100644 --- a/include/d/d_bg_w.h +++ b/include/d/d_bg_w.h @@ -153,6 +153,10 @@ class cBgW : public dBgW_Base { u32 GetMaskPolyInf1_NoShift(int, u32) const; u32 GetPolyInf2(int, u32, u32) const; int GetTriGrp(int) const; + + #if DEBUG + void DebugLocalPos(); + #endif virtual ~cBgW(); virtual bool ChkMemoryError(); @@ -215,23 +219,23 @@ class cBgW : public dBgW_Base { virtual bool ChkShdwDrawThrough(int, cBgS_PolyPassChk*); virtual bool ChkGrpThrough(int, cBgS_GrpPassChk*, int); - u32 GetOldInvMtx(Mtx m) { return MTXInverse(m_inv_mtx, m); } - MtxP GetBaseMtxP() { return pm_base; } - bool ChkNoCalcVtx() { return mFlags & NO_CALC_VTX_e; } - bool ChkFlush() { return field_0x91 & 8; } + u32 GetOldInvMtx(Mtx m) const { return PSMTXInverse(m_inv_mtx, m); } + MtxP GetBaseMtxP() { return *pm_base; } + BOOL ChkNoCalcVtx() { return mFlags & NO_CALC_VTX_e; } + BOOL ChkFlush() { return field_0x91 & 8; } void SetLock() { mFlags |= (u8)LOCK_e; } void OffRoofRegist() { field_0x91 |= (u8)0x4; } void OnRoofRegist() { field_0x91 &= ~0x04; } - bool ChkRoofRegist() { return field_0x91 & 4;} + bool ChkRoofRegist() { return (field_0x91 & 4) == 0;} cBgD_Vtx_t* GetVtxTbl() const { return pm_vtx_tbl; } int GetVtxNum() const { return pm_bgd->m_v_num; } void ClrNoCalcVtx() { mFlags &= ~NO_CALC_VTX_e; } - void SetBaseMtxP(MtxP mtx) { pm_base = mtx; } + void SetBaseMtxP(Mtx* mtx) { pm_base = mtx; } void SetNoCalcVtx() { mFlags |= NO_CALC_VTX_e; } cBgD_t* GetBgd() const { return pm_bgd; } public: - /* 0x18 */ MtxP pm_base; // Model Matrix + /* 0x18 */ Mtx* pm_base; // Model Matrix /* 0x1C */ Mtx m_inv_mtx; /* 0x4C */ Mtx m_mtx; /* 0x7C */ cXyz mTransVel; @@ -330,10 +334,16 @@ class dBgW : public cBgW { virtual bool ChkShdwDrawThrough(int, cBgS_PolyPassChk*); virtual bool ChkGrpThrough(int, cBgS_GrpPassChk*, int); + #if DEBUG + void DrawBox() const; + void DebugDraw() const; + void DrawPoly(const cBgS_PolyInfo&, const GXColor&) const; + #endif + void SetCrrFunc(dBgW_CrrFunc func) { m_crr_func = func; } void SetRideCallback(dBgW_RideCallback func) { m_ride_callback = func; } void SetArrowStickCallback(dBgW_ArrowStickCallback func) { m_arrow_stick_callback = func; } - void OnMoveFlag() { m_flags |= 1; } + void OnMoveFlag() { m_flags |= (u8)1; } private: /* 0xB0 */ dBgW_CrrFunc m_crr_func; @@ -344,4 +354,8 @@ class dBgW : public cBgW { dBgW* dBgW_NewSet(cBgD_t* pbgd, u32 flags, Mtx* pbase_mtx); +#if DEBUG +extern u8 lbl_8074C7F0; +#endif + #endif /* D_BG_D_BG_W_H */ diff --git a/include/d/d_bg_w_base.h b/include/d/d_bg_w_base.h index b8127cde6a9..900b87c307d 100644 --- a/include/d/d_bg_w_base.h +++ b/include/d/d_bg_w_base.h @@ -106,16 +106,16 @@ class dBgW_Base : public cBgW_BgId { virtual void CallArrowStickCallBack(fopAc_ac_c*, fopAc_ac_c*, cXyz&); #if DEBUG - virtual void DebugDraw() {} - virtual void DrawPoly(cBgS_PolyInfo const& param_0, GXColor const& param_1) {} - virtual void DebugBox() {} + virtual void DebugDraw() const {} + virtual void DrawPoly(cBgS_PolyInfo const& param_0, GXColor const& param_1) const {} + virtual void DrawBox() const {} #endif PushPull_CallBack GetPushPullCallback() const { return m_pushPull_Callback; } s16 GetDiffShapeAngleY() { return m_diff_ShapeAngleY; } int GetRoomId() { return m_roomId; } - bool chkStickWall() { return field_0xb & 1; } - bool chkStickRoof() { return field_0xb & 2; } + BOOL chkStickWall() { return field_0xb & 1; } + BOOL chkStickRoof() { return field_0xb & 2; } bool ChkPushPullOk() const { return m_pushPull_Ok; } void SetPushPullCallback(PushPull_CallBack i_callBack) { m_pushPull_Callback = i_callBack; } void SetRoomId(int id) { m_roomId = id; } diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index cc233eb7504..1d6edbb860f 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -616,6 +616,7 @@ class dComIfG_play_c { void setItemMaxMagicCount(s16 max) { mItemInfo.mItemMaxMagicCount += max; } s32 getItemOilCount() { return mItemInfo.mItemOilCount; } void setItemOilCount(s32 oil) { mItemInfo.mItemOilCount += oil; } + void setItemMaxOilCount(s32 oil) { mItemInfo.mItemMaxOilCount += oil; } void clearItemOilCount() { mItemInfo.mItemOilCount = 0; } s32 getItemNowOil() { return mItemInfo.mItemNowOil; } void setItemNowOil(s32 oil) { mItemInfo.mItemNowOil = oil; } @@ -630,6 +631,7 @@ class dComIfG_play_c { s32 getOxygenCount() { return mItemInfo.mOxygenCount; } void setOxygenCount(s32 oxygen) { mItemInfo.mOxygenCount += oxygen; } void clearOxygenCount() { mItemInfo.mOxygenCount = 0; } + void setMaxOxygenCount(s32 oxygen) { mItemInfo.mMaxOxygenCount += oxygen; } s32 getMaxOxygenCount() { return mItemInfo.mMaxOxygenCount; } void clearMaxOxygenCount() { mItemInfo.mMaxOxygenCount = 0; } s16 getItemArrowNumCount() { return mItemInfo.mItemArrowNumCount; } @@ -1615,6 +1617,10 @@ inline u8 dComIfGs_getBombMax(u8 i_bombType) { return g_dComIfG_gameInfo.info.getPlayer().getItemMax().getBombNum(i_bombType); } +inline void dComIfGs_setPohSpiritNum(u8 i_num) { + g_dComIfG_gameInfo.info.getPlayer().getCollect().setPohNum(i_num); +} + inline u8 dComIfGs_getPohSpiritNum() { return g_dComIfG_gameInfo.info.getPlayer().getCollect().getPohNum(); } @@ -1623,6 +1629,10 @@ inline void dComIfGs_addPohSpiritNum() { g_dComIfG_gameInfo.info.getPlayer().getCollect().addPohNum(); } +inline BOOL dComIfGs_isCollectClothes(u8 i_clothesNo) { + return g_dComIfG_gameInfo.info.getPlayer().getCollect().isCollect(COLLECT_CLOTHING, i_clothesNo); +} + inline void dComIfGs_setCollectClothes(u8 i_clothesNo) { g_dComIfG_gameInfo.info.getPlayer().getCollect().setCollect(COLLECT_CLOTHING, i_clothesNo); } @@ -1640,18 +1650,34 @@ inline BOOL dComIfGs_isCollectClothing(u8 i_clothesNo) { i_clothesNo); } +inline void dComIfGs_offCollectClothes(u8 i_clothesNo) { + g_dComIfG_gameInfo.info.getPlayer().getCollect().offCollect(COLLECT_CLOTHING, i_clothesNo); +} + inline BOOL dComIfGs_isCollectSword(u8 i_swordNo) { return g_dComIfG_gameInfo.info.getPlayer().getCollect().isCollect(COLLECT_SWORD, i_swordNo); } +inline void dComIfGs_offCollectSword(u8 i_swordNo) { + g_dComIfG_gameInfo.info.getPlayer().getCollect().offCollect(COLLECT_SWORD, i_swordNo); +} + inline BOOL dComIfGs_isCollectShield(u8 i_item) { return g_dComIfG_gameInfo.info.getPlayer().getCollect().isCollect(COLLECT_SHIELD, i_item); } +inline void dComIfGs_offCollectShield(u8 i_shieldNo) { + g_dComIfG_gameInfo.info.getPlayer().getCollect().offCollect(COLLECT_SHIELD, i_shieldNo); +} + inline void dComIfGs_onCollectCrystal(u8 i_item) { g_dComIfG_gameInfo.info.getPlayer().getCollect().onCollectCrystal(i_item); } +inline void dComIfGs_offCollectCrystal(u8 i_item) { + g_dComIfG_gameInfo.info.getPlayer().getCollect().offCollectCrystal(i_item); +} + inline bool dComIfGs_isCollectCrystal(u8 i_item) { return g_dComIfG_gameInfo.info.getPlayer().getCollect().isCollectCrystal(i_item); } @@ -1660,6 +1686,10 @@ inline void dComIfGs_onCollectMirror(u8 i_item) { g_dComIfG_gameInfo.info.getPlayer().getCollect().onCollectMirror(i_item); } +inline void dComIfGs_offCollectMirror(u8 i_item) { + g_dComIfG_gameInfo.info.getPlayer().getCollect().offCollectMirror(i_item); +} + inline bool dComIfGs_isCollectMirror(u8 i_item) { return g_dComIfG_gameInfo.info.getPlayer().getCollect().isCollectMirror(i_item); } @@ -3457,7 +3487,7 @@ inline u8 dComIfGp_getItemLifeCountType() { return g_dComIfG_gameInfo.play.getItemLifeCountType(); } -inline void dComIfGp_setItemLifeCount(float amount, u8 type) { +inline void dComIfGp_setItemLifeCount(f32 amount, u8 type) { g_dComIfG_gameInfo.play.setItemLifeCount(amount, type); } @@ -3521,6 +3551,10 @@ inline void dComIfGp_setItemOilCount(s32 oil) { g_dComIfG_gameInfo.play.setItemOilCount(oil); } +inline void dComIfGp_setItemMaxOilCount(s32 oil) { + g_dComIfG_gameInfo.play.setItemMaxOilCount(oil); +} + inline void dComIfGp_clearItemOilCount() { g_dComIfG_gameInfo.play.clearItemOilCount(); } @@ -3577,6 +3611,10 @@ inline void dComIfGp_clearOxygenCount() { g_dComIfG_gameInfo.play.clearOxygenCount(); } +inline void dComIfGp_setMaxOxygenCount(s32 oxygen) { + g_dComIfG_gameInfo.play.setMaxOxygenCount(oxygen); +} + inline s32 dComIfGp_getMaxOxygenCount() { return g_dComIfG_gameInfo.play.getMaxOxygenCount(); } diff --git a/include/d/d_menu_window_HIO.h b/include/d/d_menu_window_HIO.h index 1df1b5cb720..b5d5c81fb4a 100644 --- a/include/d/d_menu_window_HIO.h +++ b/include/d/d_menu_window_HIO.h @@ -1,75 +1,83 @@ #ifndef D_MENU_D_MENU_WINDOW_HIO_H #define D_MENU_D_MENU_WINDOW_HIO_H -#include +#include "JSystem/JHostIO/JORReflexible.h" -class dMw_DHIO_c { +class dMw_DHIO_c : public JORReflexible { public: dMw_DHIO_c(); virtual ~dMw_DHIO_c() {} + void genMessage(JORMContext*); + + void bitCheck(); /* 0x004 */ s8 field_0x4; - /* 0x005 */ bool mMap[32]; - /* 0x025 */ bool mCompass[32]; - /* 0x045 */ bool mBossKey[32]; - /* 0x065 */ bool mBossClear[32]; - /* 0x085 */ bool mHeartContainer[32]; - /* 0x0A5 */ bool mBossDemo[32]; - /* 0x0C5 */ bool mPortal[32]; - /* 0x0E5 */ bool mMidBossClear[32]; - /* 0x105 */ bool mMapCopy[32]; - /* 0x125 */ bool mCompassCopy[32]; - /* 0x145 */ bool mBossKeyCopy[32]; - /* 0x165 */ bool mBossClearCopy[32]; - /* 0x185 */ bool mHeartContainerCopy[32]; - /* 0x1A5 */ bool mBossDemoCopy[32]; - /* 0x1C5 */ bool mPortalCopy[32]; - /* 0x1E5 */ bool mMidBossClearCopy[32]; + /* 0x005 */ u8 mMap[32]; + /* 0x025 */ u8 mCompass[32]; + /* 0x045 */ u8 mBossKey[32]; + /* 0x065 */ u8 mBossClear[32]; + /* 0x085 */ u8 mHeartContainer[32]; + /* 0x0A5 */ u8 mBossDemo[32]; + /* 0x0C5 */ u8 mPortal[32]; + /* 0x0E5 */ u8 mMidBossClear[32]; + /* 0x105 */ u8 mMapCopy[32]; + /* 0x125 */ u8 mCompassCopy[32]; + /* 0x145 */ u8 mBossKeyCopy[32]; + /* 0x165 */ u8 mBossClearCopy[32]; + /* 0x185 */ u8 mHeartContainerCopy[32]; + /* 0x1A5 */ u8 mBossDemoCopy[32]; + /* 0x1C5 */ u8 mPortalCopy[32]; + /* 0x1E5 */ u8 mMidBossClearCopy[32]; }; extern dMw_DHIO_c g_mwDHIO; -class dMw_HIO_c { +class dMw_HIO_c : public JORReflexible { public: dMw_HIO_c(); void init(); - bool getBombFlag(); - bool getArrowFlag(); - bool getPachinkoFlag(); + u8 getBombFlag(); + u8 getArrowFlag(); + u8 getPachinkoFlag(); void update(); + void playerStatusHIO(); + void itemBitCheck(); + void itemNumHIO(); + void itemHIO(); void setArrowFlag(u8 i_flag) { mArrowFlag = i_flag; } void setPachinkoFlag(u8 i_flag) { mPachinkoFlag = i_flag; } void setBombFlag(u8 i_flag) { mBombFlag = i_flag; } virtual ~dMw_HIO_c() {} + void genMessage(JORMContext*); /* 0x004 */ s8 field_0x4; - /* 0x006 */ u16 mLife; - /* 0x008 */ u16 mMaxLife; + /* 0x006 */ s16 mLife; + /* 0x008 */ s16 mMaxLife; /* 0x00A */ u8 mMagic; /* 0x00B */ u8 mMaxMagic; /* 0x00C */ s32 mOil; /* 0x010 */ s32 mMaxOil; /* 0x014 */ s32 mOxygen; /* 0x018 */ s32 mMaxOxygen; - /* 0x01C */ bool mEnableMagic; - /* 0x01D */ bool mEnableArrowDrops; + /* 0x01C */ u8 mEnableMagic; + /* 0x01D */ u8 mEnableArrowDrops; /* 0x01E */ s16 mRupees; /* 0x020 */ s16 mWalletSize; /* 0x022 */ u8 mKeys; /* 0x023 */ u8 field_0x23; - /* 0x024 */ u16 mLifeCopy; - /* 0x026 */ u16 mMaxLifeCopy; + /* 0x024 */ s16 mLifeCopy; + /* 0x026 */ s16 mMaxLifeCopy; /* 0x028 */ u8 mMagicCopy; /* 0x029 */ u8 mMaxMagicCopy; /* 0x02C */ s32 mOilCopy; /* 0x030 */ s32 mMaxOilCopy; /* 0x034 */ s32 mOxygenCopy; /* 0x038 */ s32 mMaxOxygenCopy; - /* 0x03C */ bool mEnableMagicCopy; - /* 0x03D */ bool mEnableArrowDropsCopy; + /* 0x03C */ u8 mEnableMagicCopy; + /* 0x03D */ u8 mEnableArrowDropsCopy; /* 0x03E */ s16 mRupeesCopy; /* 0x040 */ s16 mWalletSizeCopy; /* 0x042 */ s16 mDonationAmount; @@ -81,23 +89,23 @@ class dMw_HIO_c { /* 0x04A */ u8 mItems[24]; /* 0x062 */ u8 mItemsCopy[24]; /* 0x07A */ u8 field_0x7a[24]; - /* 0x092 */ bool mSwords[4]; - /* 0x096 */ bool mShields[3]; - /* 0x099 */ bool mClothes[3]; - /* 0x09C */ bool mSwordsCopy[4]; - /* 0x0A0 */ bool mShieldsCopy[3]; - /* 0x0A3 */ bool mClothesCopy[3]; + /* 0x092 */ u8 mSwords[4]; + /* 0x096 */ u8 mShields[3]; + /* 0x099 */ u8 mClothes[3]; + /* 0x09C */ u8 mSwordsCopy[4]; + /* 0x0A0 */ u8 mShieldsCopy[3]; + /* 0x0A3 */ u8 mClothesCopy[3]; /* 0x0A6 */ u8 mScent; /* 0x0A7 */ u8 mScentCopy; /* 0x0A8 */ u8 field_0xa8; - /* 0x0A9 */ bool mBombBagLV2; - /* 0x0AA */ bool mBombBagLV2Copy; - /* 0x0AB */ bool mLV2KeyShards[3]; - /* 0x0AE */ bool mLV2KeyShardsCopy[3]; - /* 0x0B1 */ bool mLV5Item[2]; - /* 0x0B3 */ bool mLV5ItemCopy[2]; - /* 0x0B5 */ bool mGoldBug[24]; - /* 0x0CD */ bool mGoldBugCopy[24]; + /* 0x0A9 */ u8 mBombBagLV2; + /* 0x0AA */ u8 mBombBagLV2Copy; + /* 0x0AB */ u8 mLV2KeyShards[3]; + /* 0x0AE */ u8 mLV2KeyShardsCopy[3]; + /* 0x0B1 */ u8 mLV5Item[2]; + /* 0x0B3 */ u8 mLV5ItemCopy[2]; + /* 0x0B5 */ u8 mGoldBug[24]; + /* 0x0CD */ u8 mGoldBugCopy[24]; /* 0x0E5 */ u8 mArrowNum; /* 0x0E6 */ u8 mSeedNum; /* 0x0E7 */ u8 mBombNum[3]; @@ -112,15 +120,15 @@ class dMw_HIO_c { /* 0x101 */ u8 field_0x101[8]; /* 0x109 */ u8 field_0x109[8]; /* 0x111 */ u8 field_0x111[8]; - /* 0x119 */ bool mEnableOxygenMeter; - /* 0x11A */ bool mEnableOxygenMeterCopy; + /* 0x119 */ u8 mEnableOxygenMeter; + /* 0x11A */ u8 mEnableOxygenMeterCopy; /* 0x11B */ u8 mArrowFlag; /* 0x11C */ u8 mPachinkoFlag; /* 0x11D */ u8 mBombFlag; - /* 0x11E */ bool mFusedShadow[4]; - /* 0x122 */ bool mFusedShadowCopy[4]; - /* 0x126 */ bool mMirrorShard[4]; - /* 0x12A */ bool mMirrorShardCopy[4]; + /* 0x11E */ u8 mFusedShadow[4]; + /* 0x122 */ u8 mFusedShadowCopy[4]; + /* 0x126 */ u8 mMirrorShard[4]; + /* 0x12A */ u8 mMirrorShardCopy[4]; }; // Size: 0x130 extern dMw_HIO_c g_mwHIO; diff --git a/include/d/d_msg_object.h b/include/d/d_msg_object.h index 2ef3f0ad69b..45606e4e818 100644 --- a/include/d/d_msg_object.h +++ b/include/d/d_msg_object.h @@ -557,6 +557,11 @@ inline bool dMsgObject_isSelectTalkNowCheck() { return dMsgObject_getMsgObjectClass()->getStatus() != 8 || (dMsgObject_getMsgObjectClass()->getStatus() != 9 && dMsgObject_getMsgObjectClass()->getStatus() != 20); } +inline void dMsgObject_setOffering(u16 i_num) { + dComIfGs_setEventReg(0xF7FF, i_num >> 8); + dComIfGs_setEventReg(0xF8FF, i_num & 0xFF); +} + class dMsgObject_HowlHIO_c { public: dMsgObject_HowlHIO_c(); diff --git a/include/d/d_save.h b/include/d/d_save.h index e56137ef51b..3bcb4766a06 100644 --- a/include/d/d_save.h +++ b/include/d/d_save.h @@ -396,12 +396,14 @@ class dSv_player_collect_c { void offCollectMirror(u8 i_item); BOOL isCollectMirror(u8 i_item) const; + void setPohNum(u8 i_num) { mPohNum = i_num; } u8 getPohNum() const { return mPohNum; } + void addPohNum() { if (mPohNum < 0xFF) { mPohNum++; } - }; + } private: /* 0x0 */ u8 mItem[8]; diff --git a/src/d/actor/d_a_obj_brg.cpp b/src/d/actor/d_a_obj_brg.cpp index 6257f1740f9..cd0c504b7d0 100644 --- a/src/d/actor/d_a_obj_brg.cpp +++ b/src/d/actor/d_a_obj_brg.cpp @@ -20,7 +20,8 @@ static void ride_call_back(dBgW* i_bgw, fopAc_ac_c* i_bgActor, fopAc_ac_c* i_rid obj_brg_class* a_this = (obj_brg_class*)i_bgActor; cXyz sp74 = a_this->mBr[0].field_0x0bc - i_rideActor->current.pos; - int var_r27 = JMAFastSqrt(sp74.x * sp74.x + sp74.z * sp74.z) / (a_this->field_0xaedc * 51.0f) - -0.5f; + f32 var_f28 = JMAFastSqrt(sp74.x * sp74.x + sp74.z * sp74.z); + int var_r27 = var_f28 / (a_this->field_0xaedc * 51.0f) - -0.5f; if (var_r27 > a_this->field_0xb1ea - 1) { var_r27 = a_this->field_0xb1ea - 1; @@ -37,7 +38,7 @@ static void ride_call_back(dBgW* i_bgw, fopAc_ac_c* i_bgActor, fopAc_ac_c* i_rid if (a_this->mType & 5) { var_f30 = 0.85f; } else if (a_this->field_0xb1ed == 2) { - var_f30 = KREG_F(7) + 0.1f; + var_f30 = KREG_F(4) + 0.1f; } else { var_f30 = 1.0f; } diff --git a/src/d/actor/d_a_obj_ladder.cpp b/src/d/actor/d_a_obj_ladder.cpp index 903fb97e115..88a21141ae6 100644 --- a/src/d/actor/d_a_obj_ladder.cpp +++ b/src/d/actor/d_a_obj_ladder.cpp @@ -380,7 +380,10 @@ int Act_c::Draw() { dComIfGd_setListBG(); mDoExt_modelUpdateDL(mModel); dComIfGd_setList(); - dComIfG_Bgsp().DebugDrawPoly(mpBgW); + + #if DEBUG + dComIfG_Bgsp().DebugDrawPoly(*mpBgW); + #endif return 1; } diff --git a/src/d/actor/d_a_obj_swpush.cpp b/src/d/actor/d_a_obj_swpush.cpp index 8eede8f5477..f740c61a11b 100644 --- a/src/d/actor/d_a_obj_swpush.cpp +++ b/src/d/actor/d_a_obj_swpush.cpp @@ -240,7 +240,7 @@ cPhs_Step daObjSwpush::Act_c::Mthd_Create() { mDoMtx_stack_c::scaleM(field_0x5f8); MTXCopy(mDoMtx_stack_c::get(), mMtx); mpBgW->ClrNoCalcVtx(); - mpBgW->SetBaseMtxP(mMtx); + mpBgW->SetBaseMtxP(&mMtx); mpBgW->GlobalVtx(); mpBgW->SetBaseMtxP(NULL); mpBgW->SetNoCalcVtx(); diff --git a/src/d/d_bg_s.cpp b/src/d/d_bg_s.cpp index 7295126a6b0..44c7cc25110 100644 --- a/src/d/d_bg_s.cpp +++ b/src/d/d_bg_s.cpp @@ -11,86 +11,256 @@ #include "d/d_com_inf_game.h" #include "f_op/f_op_actor_mng.h" +#if DEBUG +#include "d/d_debug_viewer.h" +#include "d/d_bg_s_capt_poly.h" +#endif + +#if DEBUG +int g_ground_counter; +int g_line_counter; +int g_acch_wall_counter; +int g_roof_counter; +int g_spl_counter; +int g_shdw_counter; +int g_sph_counter; +int g_capt_poly_counter; +#endif + +#if DEBUG +void dBgS_HIO::genMessage(JORMContext* mctx) { + mctx->genLabel("zelda地形チェック", 0); + + mctx->genLabel("チェック回数 ----------", 0); + mctx->genCheckBox("チェックカウンター", &m_flags, FLAG_CHECK_COUNTER_e); + + mctx->genLabel("平均処理時間(Mean) -----------", 0); + mctx->genCheckBox("ラインチェック時間(->terminal)", &m_flags2, FLAG2_LINE_TIMER_e); + mctx->genCheckBox("アクターチェック時間[壁、床(+天井、水面)](->terminal)", &m_flags, 1); + mctx->genCheckBox("アクターチェック 壁チェック時間(->terminal)", &m_flags, FLAG_ACCH_WALL_TIMER_e); + mctx->genCheckBox("天井チェック時間(->terminal)", &m_flags, FLAG_ROOF_TIMER_e); + mctx->genCheckBox("Splチェック(水、溶岩、毒水面)時間(->terminal)", &m_flags2, FLAG2_SPL_TIMER_e); + mctx->genCheckBox("床チェック時間(->terminal)", &m_flags2, FLAG2_GROUND_CHECK_TIMER_e); + mctx->genCheckBox("リアル影描画時間(->terminal)", &m_flags2, FLAG2_SHDW_DRAW_TIMER_e); + mctx->genCheckBox("球チェック時間[コールバック処理含む](->terminal)", &m_flags2, FLAG2_SPH_CHK_TIMER_e); + mctx->genCheckBox("ポリゴンキャプチャ時間", &m_flags2, FLAG2_CAPTPOLY_TIMER_e); + + mctx->genLabel("処理off ----------", 0); + mctx->genCheckBox("ライン off", &m_flags2, FLAG2_LINE_OFF_e); + mctx->genCheckBox("アクターチェック 壁処理off", &m_flags, FLAG_ACCH_WALL_OFF_e); + mctx->genCheckBox("天井チェックoff", &m_flags, FLAG_ROOF_OFF_e); + mctx->genCheckBox("Splチェック(水、溶岩、毒水面)off", &m_flags2, FLAG2_SPL_OFF_e); + mctx->genCheckBox("リアル影処理Off", &m_flags2, FLAG2_SHDW_DRAW_OFF_e); + mctx->genCheckBox("球チェックOff", &m_flags2, FLAG2_SPH_CHK_OFF_e); + mctx->genCheckBox("ポリゴンキャプチャOff", &m_flags2, FLAG2_CAPTPOLY_OFF_e); + + mctx->genLabel("当たりチェック ----------", 0); + mctx->genCheckBox("ラインチェック", &m_flags, FLAG_OBJ_LINE_CHECK_e); + mctx->genSlider("start x", &m_linecheck_start.x, -450000.0, 450000.0); + mctx->genSlider("start y", &m_linecheck_start.y, -450000.0, 450000.0); + mctx->genSlider("start z", &m_linecheck_start.z, -450000.0, 450000.0); + mctx->genSlider("end x", &m_linecheck_end.x, -450000.0, 450000.0); + mctx->genSlider("end y", &m_linecheck_end.y, -450000.0, 450000.0); + mctx->genSlider("end z", &m_linecheck_end.z, -450000.0, 450000.0); + mctx->genCheckBox("Obj床チェック", &m_flags2, FLAG2_GND_CHK_e); + mctx->genSlider("gnd x", &m_gndcheck_pos.x, -450000.0, 450000.0); + mctx->genSlider("gnd y", &m_gndcheck_pos.y, -450000.0, 450000.0); + mctx->genSlider("gnd z", &m_gndcheck_pos.z, -450000.0, 450000.0); + + mctx->genLabel("抜けチェック ----------", 0); + mctx->genCheckBox("アクターチェック 抜けチェック", &m_flags, 0x200); + mctx->genSlider("抜けチェックアクター番号 ", &m_errorCheck_actor_num, -1, 3000); + mctx->genCheckBox("プレイヤーのアクター地形チェックの床法線ベクトル", &m_flags2, 0x400); + + mctx->genLabel("デバッグ表示 ----------", 0); + mctx->genCheckBox("アクターチェック 壁当たり範囲表示", &m_flags, 0x400); + mctx->genCheckBox("BoundingBox描画", &m_flags, 0x8000); + mctx->genCheckBox("当たり表示On", &m_flags2, FLAG2_SHAPE_DISP_e); + + mctx->genLabel("その他 ----------", 0); + mctx->genCheckBox("作業1", &m_flags, 0x20); + mctx->genCheckBox("作業2", &m_flags, 0x40); + mctx->genCheckBox("作業3", &m_flags, 0x80); + mctx->genCheckBox("作業4", &m_flags, 0x100); +} + +dBgS_InsideHIO::~dBgS_InsideHIO() {} + +void dBgS_InsideHIO::genMessage(JORMContext* mctx) { + mctx->genLabel("デバッグポリゴン描画 -----", 0); + mctx->genCheckBox("デバッグポリゴン描画", &m_flags, FLAG_DISP_POLY_e); + + mctx->genLabel("-----", 0); + mctx->genCheckBox("範囲描画(青い箱)", &m_flags, FLAG_DISP_DP_AREA_e); + mctx->genCheckBox("プレイヤー位置(±p0 x)", &m_flags, FLAG_PLAYER_AROUND_e); + + mctx->genLabel("-----", 0); + mctx->genCheckBox("白ワイヤーフレーム", &m_flags, FLAG_WHITE_WIRE_e); + + mctx->genLabel("-----", 0); + mctx->genCheckBox("水面ポリゴンのみ", &m_flags, FLAG_DISP_WATER_POLY_e); + + mctx->genLabel("-----", 0); + mctx->genCheckBox("床Off", &m_flags, FLAG_GROUND_OFF_e); + mctx->genCheckBox("壁Off", &m_flags, FLAG_WALL_OFF_e); + mctx->genCheckBox("天井Off", &m_flags, FLAG_ROOF_OFF_e); + + mctx->genLabel("-----", 0); + mctx->genSlider("p0 x", &m_p0.x, -100000.0, 100000.0); + mctx->genSlider("p0 y", &m_p0.y, -100000.0, 100000.0); + mctx->genSlider("p0 z", &m_p0.z, -100000.0, 100000.0); + mctx->genSlider("p1 x", &m_p1.x, -100000.0, 100000.0); + mctx->genSlider("p1 y", &m_p1.y, -100000.0, 100000.0); + mctx->genSlider("p1 z", &m_p1.z, -100000.0, 100000.0); + mctx->genSlider("持ち上げ量", &m_raise_amount, -10.0, 30.0); + + mctx->genLabel("-----", 0); + mctx->genCheckBox("Obj床 プレイヤー下", &m_flags, FLAG_GNDCHK_PLAYER_UNDER_e); +} +#endif + void cBgS_ChkElm::Init() { m_bgw_base_ptr = NULL; m_used = false; m_actor_ptr = NULL; - m_actor_id = 0xFFFFFFFF; + m_actor_id = fpcM_ERROR_PROCESS_ID_e; } -void cBgS_ChkElm::Regist2(dBgW_Base* p_data, fpc_ProcID actor_id, void* p_actor) { +void cBgS_ChkElm::Regist2(dBgW_Base* pbgw, fpc_ProcID actor_id, void* pactor) { m_used = true; - m_bgw_base_ptr = p_data; + m_bgw_base_ptr = pbgw; m_actor_id = actor_id; - m_actor_ptr = (fopAc_ac_c*)p_actor; + m_actor_ptr = (fopAc_ac_c*)pactor; } void cBgS_ChkElm::Release() { m_used = false; m_bgw_base_ptr = NULL; - m_actor_id = 0xFFFFFFFF; + m_actor_id = fpcM_ERROR_PROCESS_ID_e; m_actor_ptr = NULL; } static int l_SetCounter; -bool cBgS::Regist(dBgW_Base* p_data, fpc_ProcID actor_id, void* p_actor) { - if (p_data == NULL) { +bool cBgS::Regist(dBgW_Base* pbgw, fpc_ProcID actor_id, void* pactor) { + if (pbgw == NULL) { + // "cBgS::Regist() data is Null" + OS_REPORT_ERROR("cBgS::Regist() データがNull\n"); return true; - } else if (p_data->ChkUsed()) { + } else if (pbgw->ChkUsed()) { + // "cBgS::Regist() check duplicate entry." + OS_REPORT_ERROR("cBgS::Regist() チェック二重登録。\n"); return true; - } else if (p_data->ChkMemoryError()) { + } else if (pbgw->ChkMemoryError()) { + // "cBgS::Regist() registration rejected (dBgW_Base=%x)" + OS_REPORT_ERROR("cBgS::Regist() 登録拒否(dBgW_Base=%x)\n", pbgw); return true; - } else { - int i = l_SetCounter; - do { - if (!m_chk_element[i].m_used) { - m_chk_element[i].Regist2(p_data, actor_id, p_actor); - p_data->Regist(i); - - l_SetCounter = i + 1; - if (l_SetCounter >= 0x100) { - l_SetCounter = 0; - } - return false; - } + } - i++; - if (i >= 0x100) { - i = 0; - } - } while (l_SetCounter != i); - p_data->Release(); + #if DEBUG + for (int i = 0; i < 0x100; i++) { + if (m_chk_element[i].ChkUsed() && m_chk_element[i].m_bgw_base_ptr == pbgw) { + // "cBgS::Regist() will continue processing, but an entry with the same address (address:%x, id = %d) is already registered. This is probably a duplicate entry. Duplicate registrations are dangerous. !!" + OS_REPORT_ERROR("cBgS::Regist() 処理は続けますが、同じアドレスのもの(address:%x, id = %d)がすでに登録されています。多分ですが多重登録です。多重登録ならキケンです。!!\n", pbgw, i); + JUT_WARN(368, "%s", "cBgS::Regist() double regist"); + } } + #endif + + int i = l_SetCounter; + JUT_ASSERT(376, 0 <= i && i < 256); + + do { + if (!m_chk_element[i].ChkUsed()) { + m_chk_element[i].Regist2(pbgw, actor_id, pactor); + pbgw->Regist(i); + + l_SetCounter = i + 1; + if (l_SetCounter >= 0x100) { + l_SetCounter = 0; + } + return false; + } + + i++; + if (i >= 0x100) { + i = 0; + } + } while (l_SetCounter != i); + + JUT_WARN(398, "%s", "cBgS::Regist() regist over."); + OS_REPORT_ERROR("[ERROR] cBgS::Regist() table is no empty\n"); + pbgw->Release(); return true; } -bool cBgS::Release(dBgW_Base* p_data) { - if (p_data == NULL) { +bool cBgS::Release(dBgW_Base* pbgw) { + if (pbgw == NULL) { return 1; } - int id = p_data->GetId(); - if (p_data->ChkUsed() && id >= 0 && id < 0x100 && m_chk_element[id].ChkUsed()) { + int id = pbgw->GetId(); + if (pbgw->ChkUsed() && id >= 0 && id < 0x100 && m_chk_element[id].ChkUsed()) { + #if DEBUG + if (m_chk_element[id].m_bgw_base_ptr != pbgw) { + // "[ERROR] cBgS::Release() the work area pointer registered to %d differs from pointer passed as an argument to Release(). (%x,%x) [Releasing]" + OS_REPORT_ERROR("[ERROR] cBgS::Release() %dに登録されている作業領域のポインターと、Release()に引数で渡されているポインターが異なる。(%x,%x) [解放実行]", id, m_chk_element[id].m_bgw_base_ptr, pbgw); + JUT_WARN(431, "%s", "cBgS::Release() data error."); + } + #endif + m_chk_element[id].Release(); - p_data->Release(); + pbgw->Release(); } else { + #if DEBUG + if (id == 0x100) { + // "cBgS::Release() attempting to release unregistered terrain. operation won't be processed." + OS_WARNING("cBgS::Release() 登録していない地形をReleaseしようとしています。処理しません。\n"); + } else { + // "[Error] cBgS::Release() Error[Check id=%d won't be released.](dBgW_Base=%x)" + OS_REPORT_ERROR("[Error] cBgS::Release() Error[id=%d番のチェックはリリースしません。](dBgW_Base=%x)\n", id, pbgw); + + if (!pbgw->ChkUsed()) { + // "Data [%d] is not being used." + OS_REPORT_ERROR("データ[%d]は使っていません。\n", id); + } + + if (!m_chk_element[id].ChkUsed()) { + // "Table [%d] is not being used." + OS_REPORT_ERROR("テーブル[%d]は使っていません。\n", id); + } + } + #endif + return 1; } return 0; } +#if DEBUG +u8 lbl_8074C7F0; // belongs in d_bg_w? +static u8 lbl_8074C7F8; +#endif + void cBgS::Ct() { l_SetCounter = 0; for (int i = 0; i < 0x100; i++) { m_chk_element[i].Init(); } + + #if DEBUG + lbl_8074C7F8 = 0; + lbl_8074C7F0 = 0; + #endif } void cBgS::Dt() { for (int i = 0; i < 0x100; i++) { if (m_chk_element[i].ChkUsed()) { + JUT_WARN(499, "%s", "cBgS::Dt() release error."); + OS_REPORT_ERROR("[ERROR] ========== cBgS::Dt() 消し残し地形チェックがあります。id=%d ==========\n", i); + OS_REPORT_ERROR("!!!!!!!!! 勝手に消しときます !!!!!!!!\n"); m_chk_element[i].Release(); } } @@ -100,41 +270,41 @@ void cBgS::Dt() { } } -bool cBgS::LineCross(cBgS_LinChk* p_line) { - p_line->ClearPi(); - p_line->ClrHit(); - p_line->PreCalc(); +bool cBgS::LineCross(cBgS_LinChk* plinchk) { + plinchk->ClearPi(); + plinchk->ClrHit(); + plinchk->PreCalc(); cBgS_ChkElm* elm = m_chk_element; for (int i = 0; i < 0x100; i++) { if (elm->ChkUsed() && !elm->m_bgw_base_ptr->ChkNotReady() && - !p_line->ChkSameActorPid(elm->m_actor_id) && elm->m_bgw_base_ptr->LineCheck(p_line)) + !plinchk->ChkSameActorPid(elm->m_actor_id) && elm->m_bgw_base_ptr->LineCheck(plinchk)) { - p_line->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); - p_line->SetHit(); + plinchk->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); + plinchk->SetHit(); } elm++; } - return p_line->ChkHit(); + return plinchk->ChkHit(); } -f32 cBgS::GroundCross(cBgS_GndChk* p_gnd) { - p_gnd->SetNowY(-G_CM3D_F_INF); - p_gnd->ClearPi(); - p_gnd->PreCheck(); +f32 cBgS::GroundCross(cBgS_GndChk* pgndchk) { + pgndchk->SetNowY(-G_CM3D_F_INF); + pgndchk->ClearPi(); + pgndchk->PreCheck(); cBgS_ChkElm* elm = m_chk_element; for (int i = 0; i < 0x100; i++) { if (elm->ChkUsed() && !elm->m_bgw_base_ptr->ChkNotReady() && - !p_gnd->ChkSameActorPid(elm->m_actor_id) && elm->m_bgw_base_ptr->GroundCross(p_gnd)) + !pgndchk->ChkSameActorPid(elm->m_actor_id) && elm->m_bgw_base_ptr->GroundCross(pgndchk)) { - p_gnd->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); + pgndchk->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); } elm++; } - return p_gnd->GetNowY(); + return pgndchk->GetNowY(); } // this is identical to cBgD_t except using u32's for the table offsets. @@ -172,39 +342,46 @@ struct cBgD_Grp_t_ { u8 data[0x30]; }; -void* cBgS::ConvDzb(void* p_dzb) { - cBgD_t_* pbgd = (cBgD_t_*)p_dzb; +void* cBgS::ConvDzb(void* pdzb) { + cBgD_t_* pbgd = (cBgD_t_*)pdzb; if (((pbgd->m_flags & 0x80000000) == 0)) { pbgd->m_flags |= 0x80000000; } else { - return p_dzb; + return pdzb; } + JUT_ASSERT(596, ((int)pbgd->m_v_tbl % 4) == 0); + JUT_ASSERT(597, ((int)pbgd->m_t_tbl % 2) == 0); + JUT_ASSERT(598, ((int)pbgd->m_b_tbl % 2) == 0); + JUT_ASSERT(599, ((int)pbgd->m_tree_tbl % 2) == 0); + JUT_ASSERT(600, ((int)pbgd->m_g_tbl % 4) == 0); + JUT_ASSERT(601, ((int)pbgd->m_ti_tbl % 4) == 0); + if (pbgd->m_v_tbl != 0) { - pbgd->m_v_tbl += (uintptr_t)p_dzb; + pbgd->m_v_tbl += (uintptr_t)pdzb; } - pbgd->m_t_tbl += (uintptr_t)p_dzb; - pbgd->m_b_tbl += (uintptr_t)p_dzb; - pbgd->m_tree_tbl += (uintptr_t)p_dzb; - pbgd->m_g_tbl += (uintptr_t)p_dzb; - pbgd->m_ti_tbl += (uintptr_t)p_dzb; + pbgd->m_t_tbl += (uintptr_t)pdzb; + pbgd->m_b_tbl += (uintptr_t)pdzb; + pbgd->m_tree_tbl += (uintptr_t)pdzb; + pbgd->m_g_tbl += (uintptr_t)pdzb; + pbgd->m_ti_tbl += (uintptr_t)pdzb; for (int i = 0; i < pbgd->m_g_num; i++) { - ((cBgD_Grp_t_*)pbgd->m_g_tbl)[i].strOffset = - (uintptr_t)p_dzb + ((cBgD_Grp_t_*)pbgd->m_g_tbl)[i].strOffset; + ((cBgD_Grp_t_*)pbgd->m_g_tbl)[i].strOffset = (uintptr_t)pdzb + ((cBgD_Grp_t_*)pbgd->m_g_tbl)[i].strOffset; } - return p_dzb; + return pdzb; } fopAc_ac_c* cBgS::GetActorPointer(int actor_index) const { + JUT_ASSERT(631, 0 <= actor_index && actor_index < 256); return m_chk_element[actor_index].m_actor_ptr; } -dBgW_Base* cBgS::GetBgWBasePointer(cBgS_PolyInfo const& poly) const { - int bg_index = poly.GetBgIndex(); +dBgW_Base* cBgS::GetBgWBasePointer(const cBgS_PolyInfo& polyinfo) const { + int bg_index = polyinfo.GetBgIndex(); if (bg_index < 0 || bg_index >= 0x100 || !m_chk_element[bg_index].ChkUsed()) { return NULL; @@ -212,83 +389,147 @@ dBgW_Base* cBgS::GetBgWBasePointer(cBgS_PolyInfo const& poly) const { return m_chk_element[bg_index].m_bgw_base_ptr; } -bool cBgS::ChkPolySafe(cBgS_PolyInfo const& poly) { - if (!poly.ChkSetInfo()) { +bool cBgS::ChkPolySafe(const cBgS_PolyInfo& polyinfo) { + if (!polyinfo.ChkSetInfo()) { return false; } - int bg_index = poly.GetBgIndex(); + int bg_index = polyinfo.GetBgIndex(); if (bg_index < 0 || bg_index >= 0x100) { return false; - } else { - if (m_chk_element[bg_index].ChkUsed()) { - return poly.ChkSafe(m_chk_element[bg_index].m_bgw_base_ptr, - m_chk_element[bg_index].m_actor_id); - } else { - return false; - } } + + if (!m_chk_element[bg_index].ChkUsed()) { + return false; + } + + return polyinfo.ChkSafe(m_chk_element[bg_index].m_bgw_base_ptr, m_chk_element[bg_index].m_actor_id); } -s32 cBgS::GetGrpRoomId(cBgS_PolyInfo const& poly) const { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetGrpRoomIndex(poly); - } else { +s32 cBgS::GetGrpRoomId(const cBgS_PolyInfo& polyinfo) const { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(697, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { return 0xFF; } + + return m_chk_element[bg_index].m_bgw_base_ptr->GetGrpRoomIndex(polyinfo); } -bool cBgS::GetTriPla(cBgS_PolyInfo const& poly, cM3dGPla* p_pla) const { - int bg_index = poly.GetBgIndex(); +bool cBgS::GetTriPla(const cBgS_PolyInfo& polyinfo, cM3dGPla* ppla) const { + int bg_index = polyinfo.GetBgIndex(); if (bg_index < 0 || bg_index >= 0x100 || !m_chk_element[bg_index].ChkUsed()) { return false; } - *p_pla = m_chk_element[bg_index].m_bgw_base_ptr->GetTriPla(poly); + *ppla = m_chk_element[bg_index].m_bgw_base_ptr->GetTriPla(polyinfo); return true; } -bool cBgS::GetTriPnt(cBgS_PolyInfo const& poly, cXyz* param_1, cXyz* param_2, cXyz* param_3) const { - int id = poly.GetBgIndex(); +bool cBgS::GetTriPnt(const cBgS_PolyInfo& polyinfo, cXyz* ppnt0, cXyz* ppnt1, cXyz* ppnt2) const { + int id = polyinfo.GetBgIndex(); + JUT_ASSERT(737, 0 <= id && id < 256); + if (!m_chk_element[id].ChkUsed()) { return false; } - return m_chk_element[id].m_bgw_base_ptr->GetTriPnt(poly, param_1, param_2, param_3); + return m_chk_element[id].m_bgw_base_ptr->GetTriPnt(polyinfo, ppnt0, ppnt1, ppnt2); } -void cBgS::ShdwDraw(cBgS_ShdwDraw* p_shdw) { +void cBgS::Draw() {} + +void cBgS::ShdwDraw(cBgS_ShdwDraw* pshdw) { cBgS_ChkElm* elm = m_chk_element; for (int i = 0; i < 0x100; i++) { if (elm->ChkUsed()) { - elm->m_bgw_base_ptr->ShdwDraw(p_shdw); + elm->m_bgw_base_ptr->ShdwDraw(pshdw); } elm++; } } -u32 cBgS::GetGrpInf(cBgS_PolyInfo const& poly) const { - int id = poly.GetBgIndex(); - if (!m_chk_element[id].ChkUsed()) { +u32 cBgS::GetGrpInf(const cBgS_PolyInfo& polyinfo) const { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(803, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { return -1; } - return m_chk_element[id].m_bgw_base_ptr->GetGrpInf(poly); + return m_chk_element[bg_index].m_bgw_base_ptr->GetGrpInf(polyinfo); } +#if DEBUG +static OSStopwatch s_ground_sw; +static OSStopwatch s_line_sw; +static OSStopwatch s_wall_correct_sw; +static OSStopwatch s_roof_sw; +static OSStopwatch s_spl_sw; +static OSStopwatch s_shdw_sw; +static OSStopwatch s_sph_chk_sw; +static OSStopwatch s_capt_poly_sw; + +static dBgS_InsideHIO s_InsideHio; +#endif + void dBgS::Ct() { cBgS::Ct(); + + #if DEBUG + g_ground_counter = 0; + g_line_counter = 0; + g_acch_wall_counter = 0; + g_roof_counter = 0; + g_spl_counter = 0; + g_shdw_counter = 0; + g_sph_counter = 0; + g_capt_poly_counter = 0; + + m_hio.id = mDoHIO_CREATE_CHILD("zelda地形チェック", &m_hio); + s_InsideHio.id = mDoHIO_CREATE_CHILD("zelda地形チェック内部", &s_InsideHio); + + OSInitStopwatch(&s_ground_sw, "GroundCheck"); + OSResetStopwatch(&s_ground_sw); + + OSInitStopwatch(&s_line_sw, "LineCheck"); + OSResetStopwatch(&s_line_sw); + + OSInitStopwatch(&s_wall_correct_sw, "WallCorrect()"); + OSResetStopwatch(&s_wall_correct_sw); + + OSInitStopwatch(&s_roof_sw, "RoofChk()"); + OSResetStopwatch(&s_roof_sw); + + OSInitStopwatch(&s_spl_sw, "SplGrpChk()"); + OSResetStopwatch(&s_spl_sw); + + OSInitStopwatch(&s_shdw_sw, "ShdwDraw()"); + OSResetStopwatch(&s_shdw_sw); + + OSInitStopwatch(&s_sph_chk_sw, "SphChk()"); + OSResetStopwatch(&s_sph_chk_sw); + + OSInitStopwatch(&s_capt_poly_sw, "CaptPoly()"); + OSResetStopwatch(&s_capt_poly_sw); + #endif } void dBgS::Dt() { cBgS::Dt(); + + #if DEBUG + mDoHIO_DELETE_CHILD(m_hio.id); + mDoHIO_DELETE_CHILD(s_InsideHio.id); + #endif } void dBgS::ClrMoveFlag() { for (int i = 0; i < 0x100; i++) { if (m_chk_element[i].ChkUsed()) { - m_chk_element[i].m_bgw_base_ptr->OffMoveFlag(); + dBgW_Base* bgw_base = m_chk_element[i].m_bgw_base_ptr; + bgw_base->OffMoveFlag(); } } } @@ -297,37 +538,309 @@ void dBgS::Move() { cBgS_ChkElm* elm = m_chk_element; for (int i = 0; i < 0x100; i++) { if (elm->ChkUsed()) { - elm->m_bgw_base_ptr->CalcDiffShapeAngleY(elm->m_actor_ptr->shape_angle.y); + fopAc_ac_c* bgw_actor = elm->m_actor_ptr; + elm->m_bgw_base_ptr->CalcDiffShapeAngleY(bgw_actor->shape_angle.y); } elm++; } + + #if DEBUG + if (lbl_8074C7F8 == TRUE) { + JUTReport(20, 100, "WARNING:kcl:WCS(wall/roof poly num) is over."); + } + + if (lbl_8074C7F0 == TRUE) { + JUTReport(20, 200, "WARNING:dzb:wcs(wall/roof poly num) is over."); + } + #endif +} + +#if DEBUG +void dBgS_AabDraw(cM3dGAab& aab, GXColor& color) { + cXyz points[8]; + + points[0].x = aab.GetMinP()->x; + points[0].y = aab.GetMaxP()->y; + points[0].z = aab.GetMinP()->z; + + points[1].x = aab.GetMaxP()->x; + points[1].y = aab.GetMaxP()->y; + points[1].z = aab.GetMinP()->z; + + points[2].x = aab.GetMinP()->x; + points[2].y = aab.GetMaxP()->y; + points[2].z = aab.GetMaxP()->z; + + points[3].x = aab.GetMaxP()->x; + points[3].y = aab.GetMaxP()->y; + points[3].z = aab.GetMaxP()->z; + + points[4].x = aab.GetMinP()->x; + points[4].y = aab.GetMinP()->y; + points[4].z = aab.GetMinP()->z; + + points[5].x = aab.GetMaxP()->x; + points[5].y = aab.GetMinP()->y; + points[5].z = aab.GetMinP()->z; + + points[6].x = aab.GetMinP()->x; + points[6].y = aab.GetMinP()->y; + points[6].z = aab.GetMaxP()->z; + + points[7].x = aab.GetMaxP()->x; + points[7].y = aab.GetMinP()->y; + points[7].z = aab.GetMaxP()->z; + + dDbVw_drawCube8pOpa(points, color); +} + +static int white_draw(dBgS_CaptPoly* capt, cBgD_Vtx_t* vtxList, int v0, int v1, int v2, cM3dGPla* plane) { + cXyz raise; + PSVECScale(&plane->mNormal, &raise, s_InsideHio.m_raise_amount + 1.0f); + + cXyz start; + start.set(vtxList[v0]); + cXyz end; + end.set(vtxList[v1]); + PSVECAdd(&raise, &start, &start); + PSVECAdd(&raise, &end, &end); + + GXColor color = {0xFF, 0xFF, 0xFF, 0xFF}; + dDbVw_drawLineOpa(start, end, color, TRUE, 12); + + start.set(vtxList[v1]); + end.set(vtxList[v2]); + PSVECAdd(&raise, &start, &start); + PSVECAdd(&raise, &end, &end); + dDbVw_drawLineOpa(start, end, color, TRUE, 12); + + start.set(vtxList[v2]); + end.set(vtxList[v0]); + PSVECAdd(&raise, &start, &start); + PSVECAdd(&raise, &end, &end); + dDbVw_drawLineOpa(start, end, color, TRUE, 12); + return 0; } -bool dBgS::Regist(dBgW_Base* pbgw, fopAc_ac_c* p_actor) { +static int poly_draw(dBgS_CaptPoly* capt, cBgD_Vtx_t* vtxList, int v0, int v1, int v2, cM3dGPla* plane) { + UNUSED(capt); + + cXyz points[3]; + GXColor ground_color = {0xFF, 0, 0, 0xFF}; + GXColor roof_color = {0, 0, 0xFF, 0xFF}; + GXColor wall_color = {0, 0xFF, 0, 0xFF}; + + cXyz raise; + PSVECScale(&plane->mNormal, &raise, s_InsideHio.m_raise_amount); + + points[0] = vtxList[v0]; + points[1] = vtxList[v1]; + points[2] = vtxList[v2]; + + PSVECAdd(&points[0], &raise, &points[0]); + PSVECAdd(&points[1], &raise, &points[1]); + PSVECAdd(&points[2], &raise, &points[2]); + + if (cBgW_CheckBGround(plane->mNormal.y)) { + if (!s_InsideHio.ChkGroundOff()) { + dDbVw_drawTriangleOpa(points, ground_color, TRUE); + } + } else if (cBgW_CheckBRoof(plane->mNormal.y)) { + if (!s_InsideHio.ChkRoofOff()) { + dDbVw_drawTriangleOpa(points, roof_color, TRUE); + } + } else { + if (!s_InsideHio.ChkWallOff()) { + dDbVw_drawTriangleOpa(points, wall_color, TRUE); + } + } + + return 0; +} +#endif + +void dBgS::Draw() { + #if DEBUG + cBgS::Draw(); + + if (s_InsideHio.ChkDispPoly()) { + cM3dGAab aab; + if (s_InsideHio.ChkPlayerAround()) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz min; + cXyz max; + + f32 var_f31 = fabsf(s_InsideHio.m_p0.x); + + min.x = player->current.pos.x - var_f31; + min.y = player->current.pos.y - var_f31; + min.z = player->current.pos.z - var_f31; + max.x = player->current.pos.x + var_f31; + max.y = player->current.pos.y + var_f31; + max.z = player->current.pos.z + var_f31; + + aab.Set(&min, &max); + } else { + aab.ClearForMinMax(); + aab.SetMinMax(s_InsideHio.m_p0); + aab.SetMinMax(s_InsideHio.m_p1); + } + + if (s_InsideHio.ChkDispDpArea()) { + static GXColor l_color = {0, 0, 0xFF, 0x80}; + dBgS_AabDraw(aab, l_color); + } + + dBgS_CaptPoly capt; + capt.Set(*aab.GetMinP(), *aab.GetMaxP()); + + if (s_InsideHio.ChkDispWaterPoly()) { + capt.OffFullGrp(); + capt.OnWaterGrp(); + } else { + capt.OnFullGrp(); + } + + if (s_InsideHio.ChkWhiteWire()) { + capt.SetCallback(white_draw); + CaptPoly(capt); + } + + capt.SetCallback(poly_draw); + CaptPoly(capt); + } + + if (m_hio.ChkCheckCounter()) { + OSReport("ラインチェック %d回\n", g_line_counter); + g_line_counter = 0; + + OSReport("アクター地形チェック壁処理 %d回\n", g_acch_wall_counter); + g_acch_wall_counter = 0; + + OSReport("天井チェック %d回\n", g_roof_counter); + g_roof_counter = 0; + + OSReport("Splチェック %d回\n", g_spl_counter); + g_spl_counter = 0; + + OSReport("床チェック %d回\n", g_ground_counter); + g_ground_counter = 0; + + OSReport("リアル影 %d回\n", g_shdw_counter); + g_shdw_counter = 0; + + OSReport("球チェック %d回\n", g_sph_counter); + g_sph_counter = 0; + + OSReport("ポリゴンキャプチャ %d\n", g_capt_poly_counter); + g_capt_poly_counter = 0; + } + + if (m_hio.ChkObjLineCheck()) { + dBgS_LinChk linechk; + linechk.Set(&m_hio.m_linecheck_start, &m_hio.m_linecheck_end, NULL); + + dDbVw_drawLineOpa(m_hio.m_linecheck_start, m_hio.m_linecheck_end, (GXColor){0xFF, 0xFF, 0xFF, 0xFF}, TRUE, 12); + dDbVw_drawSphereOpa(m_hio.m_linecheck_start, 10.0f, (GXColor){0xFF, 0, 0, 0xFF}, TRUE); + dDbVw_drawSphereOpa(m_hio.m_linecheck_end, 10.0f, (GXColor){0, 0, 0xFF, 0xFF}, TRUE); + + if (LineCross(&linechk)) { + dDbVw_drawSphereOpa(*linechk.GetCrossP(), 10.0f, (GXColor){0, 0xFF, 0, 0xFF}, TRUE); + } + } + + if (m_hio.ChkGndCheck()) { + dBgS_ObjGndChk gndchk; + cXyz sp54; + + if (!s_InsideHio.ChkGndChkPlayerUnder()) { + sp54 = m_hio.m_gndcheck_pos; + } else { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz sp48(player->current.pos); + sp48.y += 200.0f; + } + + gndchk.SetPos(&sp54); + f32 var_f30 = dComIfG_Bgsp().GroundCross(&gndchk); + + cXyz sp3C; + sp3C = sp54; + sp3C.y = var_f30; + + dDbVw_drawLineOpa(sp54, sp3C, (GXColor){0, 0xFF, 0, 0xFF}, TRUE, 12); + dDbVw_drawPointOpa(sp3C, (GXColor){0xFF, 0, 0, 0xFF}, TRUE, 12); + + if (var_f30 != G_CM3D_F_INF) { + DrawPoly(gndchk, (GXColor){0xFF, 0xFF, 0, 0xFF}); + } + } + + #endif +} + +#if DEBUG +void dBgS::CaptPoly(dBgS_CaptPoly& capt) { + if (!m_hio.ChkCaptPolyOff()) { + if (m_hio.ChkCheckCounter()) { + g_capt_poly_counter++; + } + + if (m_hio.ChkCaptPolyTimer()) { + OSStartStopwatch(&s_capt_poly_sw); + } + + cBgS_ChkElm* elm = m_chk_element; + for (int i = 0; i < 0x100; i++) { + if (elm->ChkUsed()) { + elm->m_bgw_base_ptr->CaptPoly(capt); + } + elm++; + } + + if (m_hio.ChkCaptPolyTimer()) { + OSStopStopwatch(&s_capt_poly_sw); + OSDumpStopwatch(&s_capt_poly_sw); + } + } +} + +void dBgS::ChkDeleteActorRegist(fopAc_ac_c* actor) { + for (int i = 0; i < 0x100; i++) { + if (m_chk_element[i].ChkUsed() && actor == m_chk_element[i].m_actor_ptr) { + OS_REPORT_ERROR("dBgS::ChkDeleteActorRegist() [%d]削除されたアクターのポインターが、まだ登録されています。\n", i); + } + } +} +#endif + +bool dBgS::Regist(dBgW_Base* pbgw, fopAc_ac_c* pactor) { if (pbgw == NULL) { + OS_REPORT_ERROR("dBgS::Regist() pbgwがNULLのため登録できません。\n"); return true; } - if (p_actor != NULL && pbgw->ChkMoveBg()) { - pbgw->SetOldShapeAngleY(p_actor->shape_angle.y); - pbgw->SetRoomId(fopAcM_GetRoomNo(p_actor)); + if (pactor != NULL && pbgw->ChkMoveBg()) { + fopAc_ac_c* actor = pactor; + pbgw->SetOldShapeAngleY(actor->shape_angle.y); + pbgw->SetRoomId(fopAcM_GetRoomNo(actor)); } - return cBgS::Regist(pbgw, fopAcM_GetID(p_actor), p_actor); + return cBgS::Regist(pbgw, fopAcM_GetID(pactor), pactor); } void dBgW_Base::SetOldShapeAngleY(s16 shape_angle) { m_old_ShapeAngleY = shape_angle; } -bool dBgS::ChkMoveBG(cBgS_PolyInfo const& poly) { - dBgW_Base* base = dComIfG_Bgsp().GetBgWBasePointer(poly); - if (base != NULL) { - if (base->ChkLock()) { +bool dBgS::ChkMoveBG(const cBgS_PolyInfo& polyinfo) { + dBgW_Base* pbgw = dComIfG_Bgsp().GetBgWBasePointer(polyinfo); + if (pbgw != NULL) { + if (pbgw->ChkLock()) { return false; } - if (base->ChkMoveBg()) { + if (pbgw->ChkMoveBg()) { return true; } } @@ -335,182 +848,216 @@ bool dBgS::ChkMoveBG(cBgS_PolyInfo const& poly) { return false; } -bool dBgS::ChkMoveBG_NoDABg(cBgS_PolyInfo const& poly) { - dBgW_Base* base = dComIfG_Bgsp().GetBgWBasePointer(poly); - if (base != NULL && base->ChkMoveBg()) { +bool dBgS::ChkMoveBG_NoDABg(const cBgS_PolyInfo& polyinfo) { + dBgW_Base* pbgw = dComIfG_Bgsp().GetBgWBasePointer(polyinfo); + if (pbgw != NULL && pbgw->ChkMoveBg()) { return true; } return false; } -s32 dBgS::GetExitId(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetExitId(poly); - } else { +s32 dBgS::GetExitId(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1421, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { return 0x3F; } + + return m_chk_element[bg_index].m_bgw_base_ptr->GetExitId(polyinfo); } -s32 dBgS::GetPolyColor(cBgS_PolyInfo const& poly) { - if (!poly.ChkSetInfo()) { +s32 dBgS::GetPolyColor(const cBgS_PolyInfo& polyinfo) { + if (!polyinfo.ChkSetInfo()) { return 0xFF; } - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetPolyColor(poly); + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1443, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0xFF; } - return 0xFF; + return m_chk_element[bg_index].m_bgw_base_ptr->GetPolyColor(polyinfo); } -BOOL dBgS::GetHorseNoEntry(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetHorseNoEntry(poly); - } +BOOL dBgS::GetHorseNoEntry(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1460, 0 <= bg_index && bg_index < 256); - return false; + if (!m_chk_element[bg_index].ChkUsed()) { + return false; + } + + return m_chk_element[bg_index].m_bgw_base_ptr->GetHorseNoEntry(polyinfo); } -int dBgS::GetSpecialCode(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetSpecialCode(poly); +int dBgS::GetSpecialCode(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1477, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; } - return 0; + return m_chk_element[bg_index].m_bgw_base_ptr->GetSpecialCode(polyinfo); } -int dBgS::GetMagnetCode(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetMagnetCode(poly); +int dBgS::GetMagnetCode(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1494, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; } - return 0; + return m_chk_element[bg_index].m_bgw_base_ptr->GetMagnetCode(polyinfo); } -int dBgS::GetMonkeyBarsCode(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetMonkeyBarsCode(poly); +int dBgS::GetMonkeyBarsCode(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1509, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; } - return 0; + return m_chk_element[bg_index].m_bgw_base_ptr->GetMonkeyBarsCode(polyinfo); } -u32 dBgS::GetUnderwaterRoofCode(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetUnderwaterRoofCode(poly.GetPolyIndex()); +u32 dBgS::GetUnderwaterRoofCode(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1524, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; } - return 0; + return m_chk_element[bg_index].m_bgw_base_ptr->GetUnderwaterRoofCode(polyinfo.GetPolyIndex()); } -s32 dBgS::GetWallCode(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetWallCode(poly); +s32 dBgS::GetWallCode(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1574, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; } - return 0; + return m_chk_element[bg_index].m_bgw_base_ptr->GetWallCode(polyinfo); } -int dBgS::GetPolyAtt0(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetPolyAtt0(poly); +int dBgS::GetPolyAtt0(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1591, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; } - return 0; + return m_chk_element[bg_index].m_bgw_base_ptr->GetPolyAtt0(polyinfo); } -int dBgS::GetPolyAtt1(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetPolyAtt1(poly); - } +int dBgS::GetPolyAtt1(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1608, 0 <= bg_index && bg_index < 256); - return 0; + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; + } + + return m_chk_element[bg_index].m_bgw_base_ptr->GetPolyAtt1(polyinfo); } -int dBgS::GetGroundCode(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetGroundCode(poly); - } +int dBgS::GetGroundCode(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1625, 0 <= bg_index && bg_index < 256); - return 0; + if (!m_chk_element[bg_index].ChkUsed()) { + return 0; + } + + return m_chk_element[bg_index].m_bgw_base_ptr->GetGroundCode(polyinfo); } -s32 dBgS::GetCamMoveBG(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetCamMoveBG(poly); +s32 dBgS::GetCamMoveBG(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1667, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0xFF; } - return 0xFF; + return m_chk_element[bg_index].m_bgw_base_ptr->GetCamMoveBG(polyinfo); } -s32 dBgS::GetRoomCamId(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetRoomCamId(poly); +s32 dBgS::GetRoomCamId(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1684, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0xFF; } - return 0xFF; + return m_chk_element[bg_index].m_bgw_base_ptr->GetRoomCamId(polyinfo); } -s32 dBgS::GetRoomPathId(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetRoomPathId(poly); +s32 dBgS::GetRoomPathId(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1700, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0xFF; } - return 0xFF; + return m_chk_element[bg_index].m_bgw_base_ptr->GetRoomPathId(polyinfo); } -s32 dBgS::GetRoomPathPntNo(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); - if (m_chk_element[bg_index].ChkUsed()) { - return m_chk_element[bg_index].m_bgw_base_ptr->GetRoomPathPntNo(poly); +s32 dBgS::GetRoomPathPntNo(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(1717, 0 <= bg_index && bg_index < 256); + + if (!m_chk_element[bg_index].ChkUsed()) { + return 0xFF; } - return 0xFF; + return m_chk_element[bg_index].m_bgw_base_ptr->GetRoomPathPntNo(polyinfo); } -int dBgS::GetGrpSoundId(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); +int dBgS::GetGrpSoundId(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); JUT_ASSERT(1761, 0 <= bg_index && bg_index < 256); + if (!m_chk_element[bg_index].ChkUsed()) { return 0xFF; } - dBgW_Base* r30 = m_chk_element[bg_index].m_bgw_base_ptr; - return r30->GetGrpSoundId(poly); + + dBgW_Base* pbgw = m_chk_element[bg_index].m_bgw_base_ptr; + return pbgw->GetGrpSoundId(polyinfo); } -u32 dBgS::ChkGrpInf(cBgS_PolyInfo const& poly, u32 param_1) { - u32 grp_inf = GetGrpInf(poly); - return grp_inf & param_1; +u32 dBgS::ChkGrpInf(const cBgS_PolyInfo& polyinfo, u32 mask) { + u32 grp_inf = GetGrpInf(polyinfo); + return grp_inf & mask; } -int dBgS::GetRoomId(cBgS_PolyInfo const& poly) { - if (!poly.ChkSetInfo()) { +int dBgS::GetRoomId(const cBgS_PolyInfo& polyinfo) { + if (!polyinfo.ChkSetInfo()) { return -1; } - int id = poly.GetBgIndex(); - if (!ChkPolySafe(poly)) { + int id = polyinfo.GetBgIndex(); + JUT_ASSERT(1804, 0 <= id && id < 256); + if (!ChkPolySafe(polyinfo)) { return -1; } - s32 roomId = m_chk_element[id].m_bgw_base_ptr->GetRoomId(); + dBgW_Base* pbgw = m_chk_element[id].m_bgw_base_ptr; + int roomId = pbgw->GetRoomId(); if (roomId == 0xFF) { - roomId = GetGrpRoomId(poly); + roomId = GetGrpRoomId(polyinfo); if (roomId == 0xFF) { roomId = -1; } @@ -519,29 +1066,110 @@ int dBgS::GetRoomId(cBgS_PolyInfo const& poly) { return roomId; } -bool dBgS::GetPolyAttackThrough(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); +bool dBgS::GetPolyAttackThrough(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); JUT_ASSERT(1894, 0 <= bg_index && bg_index < 256); + if (!m_chk_element[bg_index].ChkUsed()) { return false; } - dBgW_Base* r30 = m_chk_element[bg_index].m_bgw_base_ptr; - return r30->GetAttackThrough(poly.GetPolyIndex()) != 0; + + dBgW_Base* pbgw = m_chk_element[bg_index].m_bgw_base_ptr; + return pbgw->GetAttackThrough(polyinfo.GetPolyIndex()) != 0; } -u32 dBgS::ChkPolyHSStick(cBgS_PolyInfo const& poly) { - int bg_index = poly.GetBgIndex(); +u32 dBgS::ChkPolyHSStick(const cBgS_PolyInfo& polyinfo) { + int bg_index = polyinfo.GetBgIndex(); JUT_ASSERT(1912, 0 <= bg_index && bg_index < 256); + if (!m_chk_element[bg_index].ChkUsed()) { return 0; } - dBgW_Base* r30 = m_chk_element[bg_index].m_bgw_base_ptr; - return r30->GetPolyHSStick(poly.GetPolyIndex()); + + dBgW_Base* pbgw = m_chk_element[bg_index].m_bgw_base_ptr; + return pbgw->GetPolyHSStick(polyinfo.GetPolyIndex()); } -void dBgS::WallCorrect(dBgS_Acch* p_acch) { - p_acch->CalcWallRR(); - p_acch->CalcMovePosWork(); +// these don't appear to be inlined based on the static var usage and location within the TU, +// but if they're not inlined then the calls in retail don't resolve to cBgS variants. +// Ifdef'ing for now to preserve both versions behavior +#if DEBUG +f32 dBgS::GroundCross(cBgS_GndChk* pgndchk) { + if (m_hio.ChkCheckCounter()) { + g_ground_counter++; + } + + if (m_hio.ChkGroundCheckTimer()) { + OSStartStopwatch(&s_ground_sw); + } + + f32 rt = cBgS::GroundCross(pgndchk); + if (m_hio.ChkGroundCheckTimer()) { + OSStopStopwatch(&s_ground_sw); + OSDumpStopwatch(&s_ground_sw); + } + + return rt; +} + +bool dBgS::LineCross(cBgS_LinChk* plinchk) { + if (m_hio.ChkLineOff()) { + return false; + } + + if (m_hio.ChkCheckCounter()) { + g_line_counter++; + } + + if (m_hio.ChkLineTimer()) { + OSStartStopwatch(&s_line_sw); + } + + bool rt = cBgS::LineCross(plinchk); + if (m_hio.ChkLineTimer()) { + OSStopStopwatch(&s_line_sw); + OSDumpStopwatch(&s_line_sw); + } + + return rt; +} + +void dBgS::ShdwDraw(cBgS_ShdwDraw* pshdwDraw) { + if (!m_hio.ChkShdwDrawOff()) { + if (m_hio.ChkCheckCounter()) { + g_shdw_counter++; + } + + if (m_hio.ChkShdwDrawTimer()) { + OSStartStopwatch(&s_shdw_sw); + } + + cBgS::ShdwDraw(pshdwDraw); + if (m_hio.ChkShdwDrawTimer()) { + OSStopStopwatch(&s_shdw_sw); + OSDumpStopwatch(&s_shdw_sw); + } + } +} +#endif + +void dBgS::WallCorrect(dBgS_Acch* pacch) { + #if DEBUG + if (m_hio.ChkAcchWallOff()) { + return; + } + + if (m_hio.ChkCheckCounter()) { + g_acch_wall_counter++; + } + + if (m_hio.ChkAcchWallTimer()) { + OSStartStopwatch(&s_wall_correct_sw); + } + #endif + + pacch->CalcWallRR(); + pacch->CalcMovePosWork(); for (int i = 0; i < 3; i++) { cBgS_ChkElm* elm = m_chk_element; @@ -550,21 +1178,42 @@ void dBgS::WallCorrect(dBgS_Acch* p_acch) { if (elm->ChkUsed() && !elm->m_bgw_base_ptr->ChkNotReady()) { dBgW_Base* pbgw = elm->m_bgw_base_ptr; - if (pbgw->ChkPriority(i) && !p_acch->ChkSameActorPid(elm->m_actor_id)) { - if (!p_acch->ChkMoveBGOnly() || (pbgw->ChkMoveBg() && !pbgw->ChkLock())) { - p_acch->SetNowActorInfo(j, elm->m_bgw_base_ptr, elm->m_actor_id); - pbgw->WallCorrect(p_acch); + if (pbgw->ChkPriority(i) && !pacch->ChkSameActorPid(elm->m_actor_id)) { + if (!pacch->ChkMoveBGOnly() || (pbgw->ChkMoveBg() && !pbgw->ChkLock())) { + pacch->SetNowActorInfo(j, elm->m_bgw_base_ptr, elm->m_actor_id); + pbgw->WallCorrect(pacch); } } } elm++; } } + + #if DEBUG + if (m_hio.ChkAcchWallTimer()) { + OSStopStopwatch(&s_wall_correct_sw); + OSDumpStopwatch(&s_wall_correct_sw); + } + #endif } -void dBgS::WallCorrectSort(dBgS_Acch* p_acch) { - p_acch->CalcWallRR(); - p_acch->CalcMovePosWork(); +void dBgS::WallCorrectSort(dBgS_Acch* pacch) { + #if DEBUG + if (m_hio.ChkAcchWallOff()) { + return; + } + + if (m_hio.ChkCheckCounter()) { + g_acch_wall_counter++; + } + + if (m_hio.ChkAcchWallTimer()) { + OSStartStopwatch(&s_wall_correct_sw); + } + #endif + + pacch->CalcWallRR(); + pacch->CalcMovePosWork(); for (int i = 0; i < 3; i++) { cBgS_ChkElm* elm = m_chk_element; @@ -573,53 +1222,95 @@ void dBgS::WallCorrectSort(dBgS_Acch* p_acch) { if (elm->ChkUsed() && !elm->m_bgw_base_ptr->ChkNotReady()) { dBgW_Base* pbgw = elm->m_bgw_base_ptr; - if (pbgw->ChkPriority(i) && !p_acch->ChkSameActorPid(elm->m_actor_id)) { - if (!p_acch->ChkMoveBGOnly() || (pbgw->ChkMoveBg() && !pbgw->ChkLock())) { - p_acch->SetNowActorInfo(j, elm->m_bgw_base_ptr, elm->m_actor_id); - pbgw->WallCorrectSort(p_acch); + if (pbgw->ChkPriority(i) && !pacch->ChkSameActorPid(elm->m_actor_id)) { + if (!pacch->ChkMoveBGOnly() || (pbgw->ChkMoveBg() && !pbgw->ChkLock())) { + pacch->SetNowActorInfo(j, elm->m_bgw_base_ptr, elm->m_actor_id); + pbgw->WallCorrectSort(pacch); } } } elm++; } } + + #if DEBUG + if (m_hio.ChkAcchWallTimer()) { + OSStopStopwatch(&s_wall_correct_sw); + OSDumpStopwatch(&s_wall_correct_sw); + } + #endif } -f32 dBgS::RoofChk(dBgS_RoofChk* p_roof) { - p_roof->Init(); +f32 dBgS::RoofChk(dBgS_RoofChk* proof) { + #if DEBUG + if (m_hio.ChkRoofOff()) { + return G_CM3D_F_INF; + } + + if (m_hio.ChkCheckCounter()) { + g_roof_counter++; + } + + if (m_hio.ChkRoofTimer()) { + OSStartStopwatch(&s_roof_sw); + } + #endif + + proof->Init(); cBgS_ChkElm* elm = m_chk_element; for (int i = 0; i < 0x100; i++) { if (elm->ChkUsed() && !elm->m_bgw_base_ptr->ChkNotReady()) { - if (!p_roof->ChkSameActorPid(elm->m_actor_id)) { + if (!proof->ChkSameActorPid(elm->m_actor_id)) { dBgW_Base* pbgw = elm->m_bgw_base_ptr; - if (pbgw->RoofChk(p_roof)) { - p_roof->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); + if (pbgw->RoofChk(proof)) { + proof->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); } } } elm++; } - return p_roof->GetNowY(); + #if DEBUG + if (m_hio.ChkAcchWallTimer()) { + OSStopStopwatch(&s_roof_sw); + OSDumpStopwatch(&s_roof_sw); + } + #endif + + return proof->GetNowY(); } -bool dBgS::SplGrpChk(dBgS_SplGrpChk* p_grp) { +bool dBgS::SplGrpChk(dBgS_SplGrpChk* pspl) { + #if DEBUG + if (m_hio.ChkSplOff()) { + return false; + } + + if (m_hio.ChkCheckCounter()) { + g_spl_counter++; + } + + if (m_hio.ChkSplTimer()) { + OSStartStopwatch(&s_spl_sw); + } + #endif + bool ret = false; - p_grp->Init(); + pspl->Init(); cBgS_ChkElm* elm = m_chk_element; for (int i = 0; i < 0x100; i++) { if (elm->ChkUsed() && !elm->m_bgw_base_ptr->ChkNotReady()) { - if (!p_grp->ChkSameActorPid(elm->m_actor_id)) { + if (!pspl->ChkSameActorPid(elm->m_actor_id)) { dBgW_Base* pbgw = elm->m_bgw_base_ptr; - if (!p_grp->ChkMoveBGOnly() || (pbgw->ChkMoveBg() && !pbgw->ChkLock())) { - if (pbgw->SplGrpChk(p_grp)) { + if (!pspl->ChkMoveBGOnly() || (pbgw->ChkMoveBg() && !pbgw->ChkLock())) { + if (pbgw->SplGrpChk(pspl)) { ret = true; - p_grp->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); - p_grp->OnFind(); + pspl->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); + pspl->OnFind(); } } } @@ -627,25 +1318,46 @@ bool dBgS::SplGrpChk(dBgS_SplGrpChk* p_grp) { elm++; } + #if DEBUG + if (m_hio.ChkAcchWallTimer()) { + OSStopStopwatch(&s_spl_sw); + OSDumpStopwatch(&s_spl_sw); + } + #endif + return ret; } -bool dBgS::SphChk(dBgS_SphChk* p_sph, void* param_1) { - if (p_sph->mCallback == NULL) { +bool dBgS::SphChk(dBgS_SphChk* psphchk, void* param_1) { + if (psphchk->mCallback == NULL) { + return false; + } + + #if DEBUG + if (m_hio.ChkSphChkOff()) { return false; } + if (m_hio.ChkCheckCounter()) { + g_sph_counter++; + } + + if (m_hio.ChkSphChkTimer()) { + OSStartStopwatch(&s_sph_chk_sw); + } + #endif + bool ret = false; - p_sph->ClearPi(); + psphchk->Init(); cBgS_ChkElm* elm = m_chk_element; for (int i = 0; i < 0x100; i++) { if (elm->ChkUsed() && !elm->m_bgw_base_ptr->ChkNotReady()) { - if (!p_sph->ChkSameActorPid(elm->m_actor_id)) { + if (!psphchk->ChkSameActorPid(elm->m_actor_id)) { dBgW_Base* pbgw = elm->m_bgw_base_ptr; - if (pbgw->SphChk(p_sph, param_1)) { - p_sph->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); + if (pbgw->SphChk(psphchk, param_1)) { + psphchk->SetActorInfo(i, elm->m_bgw_base_ptr, elm->m_actor_id); ret = true; } } @@ -653,81 +1365,109 @@ bool dBgS::SphChk(dBgS_SphChk* p_sph, void* param_1) { elm++; } + #if DEBUG + if (m_hio.ChkAcchWallTimer()) { + OSStopStopwatch(&s_sph_chk_sw); + OSDumpStopwatch(&s_sph_chk_sw); + } + #endif + return ret; } -void dBgS::MoveBgCrrPos(cBgS_PolyInfo const& i_poly, bool param_1, cXyz* i_pos, csXyz* i_angle, +void dBgS::MoveBgCrrPos(const cBgS_PolyInfo& i_poly, bool param_1, cXyz* i_pos, csXyz* i_angle, csXyz* i_shapeAngle, bool param_5, bool param_6) { if (!param_1 || !i_poly.ChkBgIndex()) { return; } int bg_index = i_poly.GetBgIndex(); + JUT_ASSERT(2414, 0 <= bg_index && bg_index < 256); + + dBgW_Base* pbgw; if (m_chk_element[bg_index].ChkUsed()) { - dBgW_Base* bgw_p = m_chk_element[bg_index].m_bgw_base_ptr; + pbgw = m_chk_element[bg_index].m_bgw_base_ptr; - if ((!param_5 || bgw_p->chkStickWall()) && (!param_6 || bgw_p->chkStickRoof()) && - bgw_p->ChkMoveFlag() && ChkPolySafe(i_poly)) + if ((!param_5 || pbgw->chkStickWall()) && (!param_6 || pbgw->chkStickRoof()) && + pbgw->ChkMoveFlag() && ChkPolySafe(i_poly)) { - bgw_p->CrrPos(i_poly, m_chk_element[bg_index].m_actor_ptr, param_1, i_pos, i_angle, + pbgw->CrrPos(i_poly, m_chk_element[bg_index].m_actor_ptr, param_1, i_pos, i_angle, i_shapeAngle); } } } -void dBgS::MoveBgTransPos(cBgS_PolyInfo const& i_poly, bool param_1, cXyz* i_pos, csXyz* i_angle, +void dBgS::MoveBgTransPos(const cBgS_PolyInfo& i_poly, bool param_1, cXyz* i_pos, csXyz* i_angle, csXyz* i_shapeAngle) { if (!param_1 || !i_poly.ChkBgIndex()) { return; } int bg_index = i_poly.GetBgIndex(); + JUT_ASSERT(2466, 0 <= bg_index && bg_index < 256); + + dBgW_Base* pbgw; if (m_chk_element[bg_index].ChkUsed()) { - dBgW_Base* bgw_p = m_chk_element[bg_index].m_bgw_base_ptr; + pbgw = m_chk_element[bg_index].m_bgw_base_ptr; - if (bgw_p->ChkMoveFlag() && ChkPolySafe(i_poly)) { - bgw_p->TransPos(i_poly, m_chk_element[bg_index].m_actor_ptr, param_1, i_pos, i_angle, + if (pbgw->ChkMoveFlag() && ChkPolySafe(i_poly)) { + pbgw->TransPos(i_poly, m_chk_element[bg_index].m_actor_ptr, param_1, i_pos, i_angle, i_shapeAngle); } } } -void dBgS::MoveBgMatrixCrrPos(cBgS_PolyInfo const& i_poly, bool param_1, cXyz* i_pos, +void dBgS::MoveBgMatrixCrrPos(const cBgS_PolyInfo& i_poly, bool param_1, cXyz* i_pos, csXyz* i_angle, csXyz* i_shapeAngle) { if (!param_1 || !i_poly.ChkBgIndex()) { return; } int bg_index = i_poly.GetBgIndex(); + JUT_ASSERT(2509, 0 <= bg_index && bg_index < 256); + + dBgW_Base* pbgw; if (m_chk_element[bg_index].ChkUsed()) { - dBgW_Base* bgw_p = m_chk_element[bg_index].m_bgw_base_ptr; + pbgw = m_chk_element[bg_index].m_bgw_base_ptr; - if (bgw_p->ChkMoveFlag()) { - bgw_p->MatrixCrrPos(i_poly, m_chk_element[bg_index].m_actor_ptr, param_1, i_pos, + if (pbgw->ChkMoveFlag()) { + pbgw->MatrixCrrPos(i_poly, m_chk_element[bg_index].m_actor_ptr, param_1, i_pos, i_angle, i_shapeAngle); } } } -void dBgS_MoveBGProc_Typical(dBgW* i_bgw, void* i_actor_ptr, cBgS_PolyInfo const& i_poly, +void dBgS_MoveBGProc_Typical(dBgW* pbgw, void* i_actor_ptr, const cBgS_PolyInfo& i_poly, bool param_3, cXyz* i_pos, csXyz* i_angle, csXyz* i_shapeAngle) { - Mtx m; - if (i_bgw->GetOldInvMtx(m) != 0) { - cXyz move_old; - MTXMultVec(m, i_pos, &move_old); + UNUSED(i_actor_ptr); + UNUSED(i_poly); + UNUSED(param_3); + UNUSED(i_angle); + UNUSED(i_shapeAngle); - cXyz move_pos; - MTXMultVec(i_bgw->GetBaseMtxP(), &move_old, &move_pos); - i_pos->x = move_pos.x; - i_pos->y = move_pos.y; - i_pos->z = move_pos.z; + Mtx m; + if (pbgw->GetOldInvMtx(m) == 0) { + return; } + + cXyz move_old; + cXyz move_pos; + + PSMTXMultVec(m, i_pos, &move_old); + PSMTXMultVec(pbgw->GetBaseMtxP(), &move_old, &move_pos); + + *i_pos = move_pos; } -static void dBgS_MoveBGProc_RotY(dBgW* i_bgw, void* i_actor_ptr, cBgS_PolyInfo const& i_poly, +static void dBgS_MoveBGProc_RotY(dBgW* pbgw, void* i_actor_ptr, const cBgS_PolyInfo& i_poly, bool param_3, cXyz* i_pos, csXyz* i_angle, csXyz* i_shapeAngle) { + UNUSED(i_actor_ptr); + UNUSED(i_poly); + UNUSED(param_3); + UNUSED(i_pos); + if (i_shapeAngle != NULL) { - s16 y = i_bgw->GetDiffShapeAngleY(); + s16 y = pbgw->GetDiffShapeAngleY(); if (i_shapeAngle != NULL) { i_shapeAngle->y += y; @@ -739,101 +1479,126 @@ static void dBgS_MoveBGProc_RotY(dBgW* i_bgw, void* i_actor_ptr, cBgS_PolyInfo c } } -void dBgS_MoveBGProc_TypicalRotY(dBgW* i_bgw, void* i_actor_ptr, cBgS_PolyInfo const& i_poly, +void dBgS_MoveBGProc_TypicalRotY(dBgW* pbgw, void* i_actor_ptr, const cBgS_PolyInfo& i_poly, bool param_3, cXyz* i_pos, csXyz* i_angle, csXyz* i_shapeAngle) { - dBgS_MoveBGProc_Typical(i_bgw, i_actor_ptr, i_poly, param_3, i_pos, i_angle, i_shapeAngle); - dBgS_MoveBGProc_RotY(i_bgw, i_actor_ptr, i_poly, param_3, i_pos, i_angle, i_shapeAngle); + dBgS_MoveBGProc_Typical(pbgw, i_actor_ptr, i_poly, param_3, i_pos, i_angle, i_shapeAngle); + dBgS_MoveBGProc_RotY(pbgw, i_actor_ptr, i_poly, param_3, i_pos, i_angle, i_shapeAngle); } -void dBgS_MoveBGProc_Trans(dBgW* i_bgw, void* i_actor_ptr, cBgS_PolyInfo const& i_poly, +void dBgS_MoveBGProc_Trans(dBgW* pbgw, void* i_actor_ptr, const cBgS_PolyInfo& i_poly, bool param_3, cXyz* i_pos, csXyz* i_angle, csXyz* i_shapeAngle) { + UNUSED(i_actor_ptr); + UNUSED(i_poly); + UNUSED(param_3); + UNUSED(i_angle); + UNUSED(i_shapeAngle); + cXyz trans; - i_bgw->GetTrans(&trans); + pbgw->GetTrans(&trans); - VECAdd(i_pos, &trans, i_pos); + PSVECAdd(i_pos, &trans, i_pos); } -void dBgS::RideCallBack(cBgS_PolyInfo const& poly, fopAc_ac_c* param_1) { - int bg_index = poly.GetBgIndex(); - dBgW_Base* base = m_chk_element[bg_index].m_bgw_base_ptr; - if (base->ChkUsed()) { - base->CallRideCallBack(m_chk_element[bg_index].m_actor_ptr, param_1); +void dBgS::RideCallBack(const cBgS_PolyInfo& polyinfo, fopAc_ac_c* param_1) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(2682, 0 <= bg_index && bg_index < 256); + + dBgW_Base* pbgw = m_chk_element[bg_index].m_bgw_base_ptr; + if (!pbgw->ChkUsed()) { + OS_REPORT_ERROR("dBgS::RideCallBack() Error\n"); + } else { + pbgw->CallRideCallBack(m_chk_element[bg_index].m_actor_ptr, param_1); } } -void dBgS::ArrowStickCallBack(cBgS_PolyInfo const& poly, fopAc_ac_c* param_1, cXyz& param_2) { - int bg_index = poly.GetBgIndex(); - dBgW_Base* base = m_chk_element[bg_index].m_bgw_base_ptr; - if (base->ChkUsed()) { - base->CallArrowStickCallBack(m_chk_element[bg_index].m_actor_ptr, param_1, param_2); +void dBgS::ArrowStickCallBack(const cBgS_PolyInfo& polyinfo, fopAc_ac_c* param_1, cXyz& param_2) { + int bg_index = polyinfo.GetBgIndex(); + JUT_ASSERT(2704, 0 <= bg_index && bg_index < 256); + + dBgW_Base* pbgw = m_chk_element[bg_index].m_bgw_base_ptr; + if (!pbgw->ChkUsed()) { + OS_REPORT_ERROR("dBgS::ArrowStickCallBack() Used Error\n"); + } else { + pbgw->CallArrowStickCallBack(m_chk_element[bg_index].m_actor_ptr, param_1, param_2); } } -fopAc_ac_c* dBgS::PushPullCallBack(cBgS_PolyInfo const& param_0, fopAc_ac_c* i_pushActor, s16 i_angle, +fopAc_ac_c* dBgS::PushPullCallBack(const cBgS_PolyInfo& param_0, fopAc_ac_c* i_pushActor, s16 i_angle, dBgW_Base::PushPullLabel i_label) { int bg_index = param_0.GetBgIndex(); - dBgW_Base* base = m_chk_element[bg_index].m_bgw_base_ptr; - if (!base->ChkUsed()) { + JUT_ASSERT(2733, 0 <= bg_index && bg_index < 256); + + dBgW_Base* pbgw = m_chk_element[bg_index].m_bgw_base_ptr; + if (!pbgw->ChkUsed()) { + OS_REPORT_ERROR("dBgS::PushPullCallBack() Error\n"); return NULL; } - if (m_chk_element[bg_index].m_actor_ptr == NULL) { + fopAc_ac_c* bg_actor = m_chk_element[bg_index].m_actor_ptr; + if (bg_actor == NULL) { return NULL; } - if (base->GetPushPullCallback() == NULL) { + dBgW::PushPull_CallBack callback = pbgw->GetPushPullCallback(); + if (callback == NULL) { return NULL; } - return base->GetPushPullCallback()(m_chk_element[bg_index].m_actor_ptr, i_pushActor, i_angle, - i_label); + return callback(bg_actor, i_pushActor, i_angle, i_label); } #if DEBUG +void dBgS::DebugDrawPoly(const dBgW_Base& param_1) { + if (m_hio.ChkShapeDisp()) { + param_1.DebugDraw(); + } +} -void dBgS::DrawPoly(cBgS_PolyInfo const& polyInfo, GXColor const& color) { +void dBgS::DrawPoly(const cBgS_PolyInfo& polyInfo, GXColor const& color) { dBgW_Base* pdBgw = dComIfG_Bgsp().GetBgWBasePointer(polyInfo); if (pdBgw != NULL) { pdBgw->DrawPoly(polyInfo, color); } } - #endif -bool dBgS_CheckBWallPoly(cBgS_PolyInfo const& poly) { +bool dBgS_CheckBWallPoly(const cBgS_PolyInfo& polyinfo) { cM3dGPla pla; - if (!dComIfG_Bgsp().GetTriPla(poly, &pla)) { + bool rt = dComIfG_Bgsp().GetTriPla(polyinfo, &pla); + if (!rt) { return false; } return cBgW_CheckBWall(pla.mNormal.y); } -bool dBgS_CheckBGroundPoly(cBgS_PolyInfo const& poly) { +bool dBgS_CheckBGroundPoly(const cBgS_PolyInfo& polyinfo) { cM3dGPla pla; - if (!dComIfG_Bgsp().GetTriPla(poly, &pla)) { + bool rt = dComIfG_Bgsp().GetTriPla(polyinfo, &pla); + if (!rt) { return false; } return cBgW_CheckBGround(pla.mNormal.y); } -bool dBgS_CheckBRoofPoly(cBgS_PolyInfo const& poly) { +bool dBgS_CheckBRoofPoly(const cBgS_PolyInfo& polyinfo) { cM3dGPla pla; - if (!dComIfG_Bgsp().GetTriPla(poly, &pla)) { + bool rt = dComIfG_Bgsp().GetTriPla(polyinfo, &pla); + if (!rt) { return false; } return cBgW_CheckBRoof(pla.mNormal.y); } -f32 dBgS_GetNY(cBgS_PolyInfo const& poly) { +f32 dBgS_GetNY(const cBgS_PolyInfo& polyinfo) { cM3dGPla pla; - dComIfG_Bgsp().GetTriPla(poly, &pla); + dComIfG_Bgsp().GetTriPla(polyinfo, &pla); return pla.mNormal.y; } diff --git a/src/d/d_bg_s_acch.cpp b/src/d/d_bg_s_acch.cpp index 0259c3f55d5..7ff969fde08 100644 --- a/src/d/d_bg_s_acch.cpp +++ b/src/d/d_bg_s_acch.cpp @@ -11,6 +11,10 @@ #include "d/d_com_inf_game.h" #include "global.h" +#if DEBUG +#include "d/d_debug_viewer.h" +#endif + dBgS_AcchCir::dBgS_AcchCir() { m_flags = 0; m_wall_rr = 0.0f; @@ -22,26 +26,26 @@ dBgS_AcchCir::dBgS_AcchCir() { } void dBgS_AcchCir::ClrWallHit() { - m_flags &= ~WALL_HIT; + m_flags &= ~FLAG_WALL_HIT; ClearPi(); } -void dBgS_AcchCir::SetWallR(f32 i_wall_r) { - m_wall_r = i_wall_r; +void dBgS_AcchCir::SetWallR(f32 wall_r) { + m_wall_r = wall_r; } void dBgS_AcchCir::CalcWallRR() { m_wall_rr = m_wall_r * m_wall_r; } -void dBgS_AcchCir::SetWall(f32 i_wall_h, f32 i_wall_r) { - SetWallH(i_wall_h); - SetWallR(i_wall_r); +void dBgS_AcchCir::SetWall(f32 wall_h, f32 wall_r) { + SetWallH(wall_h); + SetWallR(wall_r); } -void dBgS_AcchCir::SetWallHDirect(f32 i_h_direct) { +void dBgS_AcchCir::SetWallHDirect(f32 h_direct) { m_flags |= WALL_H_DIRECT; - m_wall_h_direct = i_h_direct; + m_wall_h_direct = h_direct; } dBgS_Acch::~dBgS_Acch() {} @@ -89,40 +93,43 @@ void dBgS_Acch::Init() { } } -void dBgS_Acch::Set(cXyz* i_pos, cXyz* i_old_pos, fopAc_ac_c* i_actor, int i_tbl_size, - dBgS_AcchCir* i_acchcir, cXyz* i_speed, csXyz* i_angle, csXyz* i_shape_angle) { - pm_pos = i_pos; - pm_old_pos = i_old_pos; +void dBgS_Acch::Set(cXyz* ppos, cXyz* pold_pos, fopAc_ac_c* pactor, int tbl_size, + dBgS_AcchCir* pacchcir, cXyz* pspeed, csXyz* pangle, csXyz* pshape_angle) { + pm_pos = ppos; + pm_old_pos = pold_pos; JUT_ASSERT(246, pm_pos != NULL); JUT_ASSERT(247, pm_old_pos != NULL); - m_my_ac = i_actor; - fpc_ProcID id = fopAcM_GetID(i_actor); + m_my_ac = pactor; + + fpc_ProcID id = fopAcM_GetID(pactor); SetActorPid(id); - pm_speed = i_speed; - m_tbl_size = i_tbl_size; - pm_acch_cir = i_acchcir; - pm_angle = i_angle; - pm_shape_angle = i_shape_angle; + + pm_speed = pspeed; + m_tbl_size = tbl_size; + pm_acch_cir = pacchcir; + pm_angle = pangle; + pm_shape_angle = pshape_angle; } -void dBgS_Acch::Set(fopAc_ac_c* i_actor, int i_tbl_size, dBgS_AcchCir* i_acchcir) { - m_tbl_size = i_tbl_size; - pm_acch_cir = i_acchcir; - m_my_ac = i_actor; +void dBgS_Acch::Set(fopAc_ac_c* pactor, int tbl_size, dBgS_AcchCir* pacchcir) { + m_tbl_size = tbl_size; + pm_acch_cir = pacchcir; + m_my_ac = pactor; - SetActorPid(fopAcM_GetID(i_actor)); - pm_pos = fopAcM_GetPosition_p(i_actor); - pm_old_pos = fopAcM_GetOldPosition_p(i_actor); - pm_speed = fopAcM_GetSpeed_p(i_actor); - pm_angle = fopAcM_GetAngle_p(i_actor); - pm_shape_angle = fopAcM_GetShapeAngle_p(i_actor); + SetActorPid(fopAcM_GetID(pactor)); + pm_pos = fopAcM_GetPosition_p(pactor); + pm_old_pos = fopAcM_GetOldPosition_p(pactor); + pm_speed = fopAcM_GetSpeed_p(pactor); + pm_angle = fopAcM_GetAngle_p(pactor); + pm_shape_angle = fopAcM_GetShapeAngle_p(pactor); } -void dBgS_Acch::GroundCheckInit(dBgS& i_bgs) { - UNUSED(i_bgs); - if (!(m_flags & 2)) { +void dBgS_Acch::GroundCheckInit(dBgS& bgs) { + UNUSED(bgs); + + if (!(m_flags & FLAG_GRND_NONE)) { m_ground_h = -G_CM3D_F_INF; m_gnd.SetExtChk(*this); field_0xb4 = ChkGroundHit(); @@ -132,8 +139,8 @@ void dBgS_Acch::GroundCheckInit(dBgS& i_bgs) { } } -void dBgS_Acch::GroundCheck(dBgS& i_bgs) { - if (!(m_flags & GRND_NONE)) { +void dBgS_Acch::GroundCheck(dBgS& bgs) { + if (!(m_flags & FLAG_GRND_NONE)) { cXyz grnd_pos; grnd_pos = *pm_pos; grnd_pos.y += field_0x94 + (m_gnd_chk_offset - field_0x90); @@ -143,15 +150,15 @@ void dBgS_Acch::GroundCheck(dBgS& i_bgs) { tmpRoofChk.SetActorPid(m_gnd.GetActorPid()); tmpRoofChk.SetPos(*pm_pos); - f32 roof_chk = i_bgs.RoofChk(&tmpRoofChk); - if (grnd_pos.y > roof_chk) { - grnd_pos.y = roof_chk; + f32 roof_y = bgs.RoofChk(&tmpRoofChk); + if (grnd_pos.y > roof_y) { + grnd_pos.y = roof_y; } } field_0x94 = 0.0f; m_gnd.SetPos(&grnd_pos); - m_ground_h = i_bgs.GroundCross(&m_gnd); + m_ground_h = bgs.GroundCross(&m_gnd); if (m_ground_h != -G_CM3D_F_INF) { field_0xbc = m_ground_h + field_0x90; @@ -162,13 +169,13 @@ void dBgS_Acch::GroundCheck(dBgS& i_bgs) { pm_speed->y = 0.0f; } - i_bgs.GetTriPla(m_gnd, &field_0xa0); + bgs.GetTriPla(m_gnd, &field_0xa0); SetGroundFind(); SetGroundHit(); if (field_0xc0 == 0) { field_0xc0 = 1; - i_bgs.RideCallBack(m_gnd, m_my_ac); + bgs.RideCallBack(m_gnd, m_my_ac); } if (field_0xb4 == 0) { @@ -183,28 +190,28 @@ void dBgS_Acch::GroundCheck(dBgS& i_bgs) { } } -void dBgS_Acch::GroundRoofProc(dBgS& i_bgs) { +void dBgS_Acch::GroundRoofProc(dBgS& bgs) { if (m_ground_h != -G_CM3D_F_INF) { if (field_0xbc < field_0xcc && field_0xcc < pm_pos->y) { pm_pos->y = field_0xcc; } - if (!(m_flags & ROOF_NONE) && m_ground_h >= m_roof_height) { + if (!(m_flags & FLAG_ROOF_NONE) && m_ground_h >= m_roof_height) { m_roof.SetExtChk(*this); ClrRoofHit(); cXyz roof_pos(*pm_pos); m_roof.SetPos(roof_pos); - m_roof_height = i_bgs.RoofChk(&m_roof); + m_roof_height = bgs.RoofChk(&m_roof); } } } -void dBgS_Acch::LineCheck(dBgS& i_bgs) { +void dBgS_Acch::LineCheck(dBgS& bgs) { dBgS_RoofChk roof_chk; roof_chk.SetActorPid(m_gnd.GetActorPid()); roof_chk.SetPos(*GetOldPos()); - f32 temp_f31 = dComIfG_Bgsp().RoofChk(&roof_chk); + f32 roof_y = dComIfG_Bgsp().RoofChk(&roof_chk); f32 var_f30 = G_CM3D_F_INF; bool var_r30 = false; @@ -218,22 +225,22 @@ void dBgS_Acch::LineCheck(dBgS& i_bgs) { old_pos = *GetOldPos(); pos = *GetPos(); - f32 var_f2 = GetWallH(i); - if (temp_f31 < old_pos.y + var_f2) { + f32 wall_h = GetWallH(i); + if (roof_y < old_pos.y + wall_h) { if (var_r29) { continue; } else { - var_f2 = (temp_f31 - old_pos.y) - 1.0f; + wall_h = (roof_y - old_pos.y) - 1.0f; var_r29 = true; } } - if (var_f30 > var_f2) { - var_f30 = var_f2; + if (var_f30 > wall_h) { + var_f30 = wall_h; } - old_pos.y += var_f2; - pos.y += var_f2; + old_pos.y += wall_h; + pos.y += wall_h; if (GetSpeedY() < 0.0f) { if (m_my_ac != NULL && fopAcM_GetName(m_my_ac) == fpcNm_ALINK_e && @@ -246,7 +253,7 @@ void dBgS_Acch::LineCheck(dBgS& i_bgs) { lin_chk.Set2(&old_pos, &pos, GetActorPid()); lin_chk.SetExtChk(*this); - if (i_bgs.LineCross(&lin_chk)) { + if (bgs.LineCross(&lin_chk)) { *GetPos() = lin_chk.GetCross(); OnLineCheckHit(); @@ -254,10 +261,10 @@ void dBgS_Acch::LineCheck(dBgS& i_bgs) { *pm_out_poly_info = lin_chk; cM3dGPla plane; - i_bgs.GetTriPla(lin_chk, &plane); + bgs.GetTriPla(lin_chk, &plane); if (!cBgW_CheckBGround(plane.mNormal.y)) { PSVECAdd(GetPos(), &plane.mNormal, GetPos()); - f32 var_f28 = JMAFastSqrt(plane.mNormal.x * plane.mNormal.x + plane.mNormal.z * plane.mNormal.z); + f32 var_f28 = JMAFastSqrt(SQUARE(plane.mNormal.x) + SQUARE(plane.mNormal.z)); if (!cM3d_IsZero(var_f28)) { pm_acch_cir[i].SetWallHDirect(GetPos()->y); } @@ -265,7 +272,7 @@ void dBgS_Acch::LineCheck(dBgS& i_bgs) { GetPos()->y -= GetWallH(i); } else { GetPos()->y -= 1.0f; - GroundCheck(i_bgs); + GroundCheck(bgs); var_r30 = true; } } @@ -273,7 +280,6 @@ void dBgS_Acch::LineCheck(dBgS& i_bgs) { if (ChkLineDown()) { f32 temp_f1 = GetOldPos()->y - GetPos()->y; - if (var_f30 != G_CM3D_F_INF && !var_r30 && !cM3d_IsZero(temp_f1)) { cBgS_LinChk lin_chk; cXyz old_pos; @@ -287,7 +293,7 @@ void dBgS_Acch::LineCheck(dBgS& i_bgs) { lin_chk.Set2(&old_pos, &pos, GetActorPid()); lin_chk.SetExtChk(*this); - if (i_bgs.LineCross(&lin_chk)) { + if (bgs.LineCross(&lin_chk)) { *GetPos() = lin_chk.GetCross(); OnLineCheckHit(); @@ -295,13 +301,13 @@ void dBgS_Acch::LineCheck(dBgS& i_bgs) { *pm_out_poly_info = lin_chk; GetPos()->y -= 1.0f; - GroundCheck(i_bgs); + GroundCheck(bgs); } } } } -void dBgS_Acch::CrrPos(dBgS& i_bgs) { +void dBgS_Acch::CrrPos(dBgS& bgs) { bool bvar9; if (!(m_flags & 1)) { JUT_ASSERT(792, pm_pos != NULL); @@ -316,7 +322,7 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { JUT_ASSERT(839, pm_pos->y < 1.0e32f); JUT_ASSERT(840, -1.0e32f < pm_pos->z && pm_pos->z < 1.0e32f); - i_bgs.MoveBgCrrPos(m_gnd, ChkGroundHit(), pm_pos, pm_angle, pm_shape_angle, false, false); + bgs.MoveBgCrrPos(m_gnd, ChkGroundHit(), pm_pos, pm_angle, pm_shape_angle, false, false); if (!ChkGroundHit()) { bvar9 = false; @@ -324,7 +330,7 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { if (ChkWallHit()) { for (int i = 0; i < m_tbl_size; i++) { if (pm_acch_cir[i].ChkWallHit()) { - i_bgs.MoveBgCrrPos(pm_acch_cir[i], true, pm_pos, pm_angle, pm_shape_angle, + bgs.MoveBgCrrPos(pm_acch_cir[i], true, pm_pos, pm_angle, pm_shape_angle, true, false); bvar9 = true; break; @@ -333,89 +339,86 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { } if (!bvar9 && ChkRoofHit()) { - i_bgs.MoveBgCrrPos(m_roof, true, pm_pos, pm_angle, pm_shape_angle, false, true); + bgs.MoveBgCrrPos(m_roof, true, pm_pos, pm_angle, pm_shape_angle, false, true); } } - GroundCheckInit(i_bgs); + GroundCheckInit(bgs); Init(); - f32 tmp = GetWallAllLowH_R(); - f32 dvar10 = GetOldPos()->abs2XZ(*GetPos()); - f32 dvar11 = GetOldPos()->y - GetPos()->y; - f32 tmp2 = GetWallAllLowH(); + f32 wall_all_low_h_r = GetWallAllLowH_R(); + f32 old_pos_dist2XZ = GetOldPos()->abs2XZ(*GetPos()); + f32 old_pos_dist_y = GetOldPos()->y - GetPos()->y; + f32 wall_all_low_h = GetWallAllLowH(); field_0xb8 = GetPos()->y; field_0xc0 = 0; - f32 fvar12 = tmp2 + GetOldPos()->y; + f32 fvar12 = wall_all_low_h + GetOldPos()->y; f32 fvar1 = m_gnd_chk_offset + GetPos()->y; bool bvar2 = false; OffLineCheckHit(); - if (!ChkLineCheckNone() && !cM3d_IsZero(tmp) && - (dvar10 > (tmp * tmp) || fvar12 > fvar1 || dvar11 > m_gnd_chk_offset || ChkLineCheck())) + if (!ChkLineCheckNone() && !cM3d_IsZero(wall_all_low_h_r) && + (old_pos_dist2XZ > SQUARE(wall_all_low_h_r) || fvar12 > fvar1 || old_pos_dist_y > m_gnd_chk_offset || ChkLineCheck())) { bvar2 = true; - LineCheck(i_bgs); + LineCheck(bgs); } - if (!(m_flags & WALL_NONE)) { + if (!(m_flags & FLAG_WALL_NONE)) { if (ChkWallSort()) { - i_bgs.WallCorrectSort(this); + bgs.WallCorrectSort(this); } else { - i_bgs.WallCorrect(this); + bgs.WallCorrect(this); } } if (ChkWallHit() && bvar2) { - LineCheck(i_bgs); + LineCheck(bgs); } + field_0xcc = G_CM3D_F_INF; - if (!(m_flags & ROOF_NONE)) { + if (!(m_flags & FLAG_ROOF_NONE)) { m_roof.SetExtChk(*this); ClrRoofHit(); - cXyz roof_pos; - roof_pos.x = pm_pos->x; - roof_pos.y = pm_pos->y; - roof_pos.z = pm_pos->z; + cXyz roof_pos(*pm_pos); m_roof.SetPos(roof_pos); - m_roof_height = i_bgs.RoofChk(&m_roof); + m_roof_height = bgs.RoofChk(&m_roof); if (m_roof_height != G_CM3D_F_INF) { - f32 y = pm_pos->y; - - if (y + m_roof_crr_height > m_roof_height) { + if (pm_pos->y + m_roof_crr_height > m_roof_height) { field_0xcc = m_roof_height - m_roof_crr_height; SetRoofHit(); } } } - if (!(m_flags & GRND_NONE)) { + if (!(m_flags & FLAG_GRND_NONE)) { ClrGroundFind(); - GroundCheck(i_bgs); - GroundRoofProc(i_bgs); + GroundCheck(bgs); + GroundRoofProc(bgs); } else { if (field_0xcc < pm_pos->y) { pm_pos->y = field_0xcc; } } - if (!(m_flags & 0x400)) { + if (!(m_flags & FLAG_WATER_NONE)) { ClrWaterHit(); ClrWaterIn(); m_wtr.SetHeight(-G_CM3D_F_INF); + bool spD = false; + f32 var_f29; f32 top; - - f32 temp_f1_5 = m_ground_h; - if (temp_f1_5 == -G_CM3D_F_INF) { + if (m_ground_h == -G_CM3D_F_INF) { var_f29 = pm_pos->y - 50.0f; + spD = true; } else { - var_f29 = temp_f1_5; + var_f29 = m_ground_h; } if (m_wtr_mode == 1) { @@ -425,7 +428,7 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { roof_chk.SetUnderwaterRoof(); roof_chk.SetPos(*pm_pos); - top = i_bgs.RoofChk(&roof_chk); + top = bgs.RoofChk(&roof_chk); if (top == G_CM3D_F_INF) { top = pm_pos->y + 1000000.0f; } @@ -438,7 +441,7 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { m_wtr.Set(ground, top); m_wtr.SetPassChkInfo(*this); - if (i_bgs.WaterChk(&m_wtr)) { + if (bgs.WaterChk(&m_wtr)) { SetWaterHit(); if (m_wtr.GetHeight() > pm_pos->y) { SetWaterIn(); @@ -460,15 +463,15 @@ void dBgS_Acch::CrrPos(dBgS& i_bgs) { } f32 dBgS_Acch::GetWallAllR() { - f32 ret = 0.0f; + f32 rt = 0.0f; for (int i = 0; i < m_tbl_size; i++) { - f32 wall_r = pm_acch_cir[i].GetWallR(); - if (ret < wall_r) { - ret = wall_r; + if (rt < pm_acch_cir[i].GetWallR()) { + rt = pm_acch_cir[i].GetWallR(); } } - return ret; + + return rt; } void dBgS_Acch::SetWallCir() { @@ -481,31 +484,26 @@ void dBgS_Acch::CalcWallBmdCyl() { if (m_tbl_size <= 0) { m_wall_cyl.Set(*pm_pos, 0.0f, 0.0f); } else { - f32 dvar8 = GetWallAllR(); - f32 dvar9 = pm_acch_cir->GetWallH(); - f32 dvar10 = pm_acch_cir->GetWallH(); + f32 wall_all_r = GetWallAllR(); + f32 wall_h_max = pm_acch_cir->GetWallH(); + f32 wall_h_min = pm_acch_cir->GetWallH(); if (m_tbl_size >= 1) { for (int i = 0; i < m_tbl_size; i++) { - f32 tmp = pm_acch_cir[i].GetWallH(); - if (dvar9 > tmp) { - dvar9 = pm_acch_cir[i].GetWallH(); + if (wall_h_max > pm_acch_cir[i].GetWallH()) { + wall_h_max = pm_acch_cir[i].GetWallH(); } - f32 tmp2 = pm_acch_cir[i].GetWallH(); - if (dvar10 < tmp2) { - dvar10 = pm_acch_cir[i].GetWallH(); + if (wall_h_min < pm_acch_cir[i].GetWallH()) { + wall_h_min = pm_acch_cir[i].GetWallH(); } } } - cXyz xyz; - xyz.x = pm_pos->x; - xyz.y = pm_pos->y; - xyz.z = pm_pos->z; - xyz.y += dvar9; + cXyz xyz(*pm_pos); + xyz.y += wall_h_max; - m_wall_cyl.Set(xyz, dvar8, dvar10 - dvar9); + m_wall_cyl.Set(xyz, wall_all_r, wall_h_min - wall_h_max); } } @@ -519,15 +517,14 @@ f32 dBgS_Acch::GetWallAllLowH() { return 0.0f; } - f32 tmp = pm_acch_cir->GetWallH(); + f32 wall_low_h = pm_acch_cir->GetWallH(); for (int i = 1; i < m_tbl_size; i++) { - f32 tmp2 = pm_acch_cir[i].GetWallH(); - if (tmp > tmp2) { - tmp = pm_acch_cir[i].GetWallH(); + if (wall_low_h > pm_acch_cir[i].GetWallH()) { + wall_low_h = pm_acch_cir[i].GetWallH(); } } - return tmp; + return wall_low_h; } f32 dBgS_Acch::GetWallAllLowH_R() { @@ -536,11 +533,10 @@ f32 dBgS_Acch::GetWallAllLowH_R() { } int index = 0; - f32 tmp = pm_acch_cir->GetWallH(); + f32 wall_h = pm_acch_cir->GetWallH(); for (int i = 1; i < m_tbl_size; i++) { - f32 tmp2 = pm_acch_cir[i].GetWallH(); - if (tmp > tmp2) { - tmp = pm_acch_cir[i].GetWallH(); + if (wall_h > pm_acch_cir[i].GetWallH()) { + wall_h = pm_acch_cir[i].GetWallH(); index = i; } } @@ -556,6 +552,49 @@ f32 dBgS_Acch::GetSpeedY() { return 0.0f; } +#if DEBUG +static GXColor blue = {0, 0, 0xFF, 0x80}; +static GXColor red = {0xFF, 0, 0, 0x80}; + +void dBgS_Acch::DrawWall(dBgS& bgs) { + if (bgs.m_hio.ChkAcchDrawWall()) { + if (!(m_flags & FLAG_WALL_NONE)) { + for (int i = 0; i < m_tbl_size; i++) { + cM3dGCir cir; + cir = *pm_acch_cir[i].GetCirP(); + + cXyz pos; + pos.x = cir.GetCx(); + pos.y = cir.GetHeight(); + pos.z = cir.GetCy(); + + f32 radius = cir.GetR(); + dDbVw_drawCylinderXlu(pos, radius, 3.0f, blue, TRUE); + + if (pm_acch_cir[i].ChkWallHit()) { + bgs.DrawPoly(pm_acch_cir[i], blue); + } + } + } else { + SetWallCir(); + + for (int i = 0; i < m_tbl_size; i++) { + cM3dGCir cir; + cir = *pm_acch_cir[i].GetCirP(); + + cXyz pos; + pos.x = cir.GetCx(); + pos.y = cir.GetHeight(); + pos.z = cir.GetCy(); + + f32 radius = cir.GetR(); + dDbVw_drawCylinderXlu(pos, radius, 3.0f, red, TRUE); + } + } + } +} +#endif + f32 dBgS_Acch::GetWallAddY(Vec& param_0) { if (!ChkGroundFind() || field_0xa0.mNormal.y < 0.5f) { return 0.0f; @@ -572,15 +611,17 @@ f32 dBgS_Acch::GetWallAddY(Vec& param_0) { return 0.0f; } -void dBgS_Acch::SetNowActorInfo(int bg_index, void* param_1, fpc_ProcID param_2) { +void dBgS_Acch::SetNowActorInfo(int bg_index, void* param_1, fpc_ProcID proc_id) { m_bg_index = bg_index; field_0x7c = param_1; - field_0x80 = param_2; + field_0x80 = proc_id; } void dBgS_Acch::SetWallPolyIndex(int index, int poly_index) { + JUT_ASSERT(1534, index <= m_tbl_size); + pm_acch_cir[index].SetActorInfo(m_bg_index, field_0x7c, field_0x80); - pm_acch_cir[index].SetPolyIndex(poly_index); + pm_acch_cir[index].SetWallPolyIndex(poly_index); } void dBgS_Acch::CalcMovePosWork() { @@ -596,35 +637,35 @@ void dBgS_Acch::CalcWallRR() { } void dBgS_Acch::SetMoveBGOnly() { - m_flags |= MOVE_BG_ONLY; + m_flags |= FLAG_MOVE_BG_ONLY; m_wtr.OnMoveBGOnly(); } void dBgS_Acch::ClrMoveBGOnly() { - m_flags &= ~MOVE_BG_ONLY; + m_flags &= ~FLAG_MOVE_BG_ONLY; m_wtr.OffMoveBGOnly(); } void dBgS_Acch::SetGndThinCellingOff() { - m_flags |= GND_THIN_CELLING_OFF; + m_flags |= FLAG_GND_THIN_CELLING_OFF; } void dBgS_Acch::ClrGndThinCellingOff() { - m_flags &= ~GND_THIN_CELLING_OFF; + m_flags &= ~FLAG_GND_THIN_CELLING_OFF; } bool dBgS_Acch::ChkGndThinCellingOff() { - return m_flags & GND_THIN_CELLING_OFF; + return m_flags & FLAG_GND_THIN_CELLING_OFF; } void dBgS_Acch::OnWallSort() { - m_flags |= WALL_SORT; + m_flags |= FLAG_WALL_SORT; } bool dBgS_Acch::ChkWallSort() { - return m_flags & WALL_SORT; + return m_flags & FLAG_WALL_SORT; } bool dBgS_Acch::ChkLineDown() { - return m_flags & LINE_DOWN; + return m_flags & FLAG_LINE_DOWN; } diff --git a/src/d/d_bg_s_capt_poly.cpp b/src/d/d_bg_s_capt_poly.cpp index 287db6ef592..11789476242 100644 --- a/src/d/d_bg_s_capt_poly.cpp +++ b/src/d/d_bg_s_capt_poly.cpp @@ -7,11 +7,11 @@ dBgS_CaptPoly::dBgS_CaptPoly() { SetPolyPassChk(GetPolyPassChkInfo()); SetGrpPassChk(GetGrpPassChkInfo()); - field_0x48 = 0; + m_callback = NULL; } void dBgS_CaptPoly::Set(cXyz& min, cXyz& max) { - aab.Set(&min, &max); + m_bnd.Set(&min, &max); JUT_ASSERT(36, !(fpclassify(min.x) == FP_QNAN)); JUT_ASSERT(37, !(fpclassify(min.y) == FP_QNAN)); diff --git a/src/d/d_bg_s_movebg_actor.cpp b/src/d/d_bg_s_movebg_actor.cpp index 3e0735cf91f..f65b0422886 100644 --- a/src/d/d_bg_s_movebg_actor.cpp +++ b/src/d/d_bg_s_movebg_actor.cpp @@ -14,8 +14,9 @@ dBgS_MoveBgActor::dBgS_MoveBgActor() { mpBgW = NULL; } -static int CheckCreateHeap(fopAc_ac_c* p_actor) { - return static_cast(p_actor)->MoveBGCreateHeap(); +static int CheckCreateHeap(fopAc_ac_c* actor) { + dBgS_MoveBgActor* i_this = (dBgS_MoveBgActor*)actor; + return i_this->MoveBGCreateHeap(); } int dBgS_MoveBgActor::CreateHeap() { @@ -68,8 +69,7 @@ int dBgS_MoveBgActor::MoveBGCreateHeap() { mpBgW = new dBgW(); if (mpBgW != NULL) { - cBgD_t* res = (cBgD_t*)dComIfG_getObjectRes(m_name, m_dzb_id); - if (!mpBgW->Set(res, cBgW::MOVE_BG_e, &mBgMtx)) { + if (!mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(m_name, m_dzb_id), cBgW::MOVE_BG_e, &mBgMtx)) { if (m_set_func != NULL) { mpBgW->SetCrrFunc(m_set_func); } @@ -87,6 +87,8 @@ int dBgS_MoveBgActor::MoveBGCreateHeap() { int dBgS_MoveBgActor::MoveBGCreate(char const* i_arcName, int i_dzb_id, MoveBGActor_SetFunc i_setFunc, u32 i_heapSize, Mtx* i_bgMtx) { + bool var_r28 = true; + if (i_bgMtx == NULL) { mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); mDoMtx_stack_c::YrotM(shape_angle.y); @@ -104,6 +106,15 @@ int dBgS_MoveBgActor::MoveBGCreate(char const* i_arcName, int i_dzb_id, return cPhs_ERROR_e; } + #if DEBUG + if (mpBgW != NULL && mpBgW->ChkUsed()) { + BOOL isDebugPad = mDoCPd_c::isConnect(PAD_3); + if (isDebugPad) { + JUT_WARN(185, "%s", "dBgS_MoveBgActor::MoveBGCreate() Don't Regist CreateHeap\n"); + } + } + #endif + if (mpBgW != NULL && dComIfG_Bgsp().Regist(mpBgW, this)) { return cPhs_ERROR_e; } @@ -116,7 +127,10 @@ int dBgS_MoveBgActor::MoveBGDelete() { int ret = Delete(); if (mpBgW != NULL && mpBgW->ChkUsed()) { - dComIfG_Bgsp().Release(mpBgW); + bool rt = dComIfG_Bgsp().Release(mpBgW); + if (rt != 0) { + OS_REPORT("Release Error\n"); + } } return ret; } diff --git a/src/d/d_bg_s_poly_pass_chk.cpp b/src/d/d_bg_s_poly_pass_chk.cpp index 1433540464f..18b60eb36b5 100644 --- a/src/d/d_bg_s_poly_pass_chk.cpp +++ b/src/d/d_bg_s_poly_pass_chk.cpp @@ -84,7 +84,10 @@ bool dBgS_PolyPassChk::ChkNoHorse() { return true; } - return !ChkHorse(); + if (!ChkHorse()) + return true; + + return false; } void dBgS_PolyPassChk::SetStatue() { diff --git a/src/d/d_bg_s_spl_grp_chk.cpp b/src/d/d_bg_s_spl_grp_chk.cpp index 2915686a47f..b09ce3c7b54 100644 --- a/src/d/d_bg_s_spl_grp_chk.cpp +++ b/src/d/d_bg_s_spl_grp_chk.cpp @@ -10,6 +10,17 @@ void dBgS_SplGrpChk::Set(cXyz& ground, f32 roof) { m_ground = ground; m_roof = roof; + + JUT_ASSERT(23, !isnan(m_ground.x)); + JUT_ASSERT(24, !isnan(m_ground.y)); + JUT_ASSERT(25, !isnan(m_ground.z)); + + JUT_ASSERT(29, -INF < m_ground.x && m_ground.x < INF); + JUT_ASSERT(30, -INF < m_ground.y && m_ground.y < INF); + JUT_ASSERT(31, -INF < m_ground.z && m_ground.z < INF); + + JUT_ASSERT(33, !isnan(m_roof)); + JUT_ASSERT(34, -INF < m_roof && m_roof < INF); } dBgS_SplGrpChk::dBgS_SplGrpChk() { diff --git a/src/d/d_bg_w.cpp b/src/d/d_bg_w.cpp index d0f5a718ebd..1407b38b158 100644 --- a/src/d/d_bg_w.cpp +++ b/src/d/d_bg_w.cpp @@ -9,11 +9,43 @@ #include "SSystem/SComponent/c_bg_s_shdw_draw.h" #include "SSystem/SComponent/c_m2d.h" #include "SSystem/SComponent/c_math.h" -#include "d/d_bg_s_cap_poly.h" +#include "d/d_bg_s_capt_poly.h" #include "d/d_bg_s_sph_chk.h" #include "d/d_com_inf_game.h" #include "d/actor/d_a_horse.h" +#if DEBUG +#include "d/d_debug_viewer.h" +#endif + +#if DEBUG +static void ASSERT_SOLDHEAP() { + JKRHeap* currentHeap = JKRGetCurrentHeap(); + u32 type = currentHeap->getHeapType(); + if (type != 'SLID') { + /** + * ******* THIS IS A BUG ******* + * ******* THIS IS A BUG ******* + * ******* THIS IS A BUG ******* + * cBgW will crash if the current heap is not a solid heap. + * Make sure to set the current heap to a solide heap. + * The memory allocated here will never be freed. + * This will cause memory leaks and certainly other bugs. + * Please fix immediately. The actor's name should be listed in the blue message below. + */ + OS_REPORT_ERROR( + "*******Aバグです*******\n" + "*******Aバグです*******\n" + "*******Aバグです*******\n" + "cBgWはカレントヒープがソリッドヒープ以外だと破綻します。\n" + "必ず、カレントヒープをソリッドヒープにしてください。\n" + "ここでnewされた領域は二度と開放されることはありません。\n" + "慢性的にメモリーリークを繰り返し、いずれ確実にAバグを引き起こすことでしょう。\n" + "必ず修正してください。この下の水色のメッセージにアクターの名前が書いてあるはずです。\n"); + } +} +#endif + cBgW_RwgElm::cBgW_RwgElm() {} cBgW_RwgElm::~cBgW_RwgElm() {} @@ -27,7 +59,10 @@ cBgW::cBgW() { mFlags = GLOBAL_e; mNeedsFullTransform = 1; mMoveCounter = 0; - mTransVel.set(0.0f, 0.0f, 0.0f); + + mTransVel.x = 0.0f; + mTransVel.y = 0.0f; + mTransVel.z = 0.0f; pm_tri = NULL; pm_rwg = NULL; @@ -60,24 +95,50 @@ void cBgW::GlobalVtx() { if (pm_base != NULL) { if (!mNeedsFullTransform) { for (int i = 0; i < pm_bgd->m_v_num; i++) { - Vec* vtx = &pm_vtx_tbl[i]; - VECAdd(vtx, &mTransVel, vtx); + PSVECAdd(&pm_vtx_tbl[i], &mTransVel, &pm_vtx_tbl[i]); } } else { + // TODO: supposed to be *pm_base, type must be wrong + JUT_ASSERT(201, + !isnan((*pm_base)[0][0]) && + !isnan((*pm_base)[0][1]) && + !isnan((*pm_base)[0][2]) && + !isnan((*pm_base)[0][3]) && + !isnan((*pm_base)[1][0]) && + !isnan((*pm_base)[1][1]) && + !isnan((*pm_base)[1][2]) && + !isnan((*pm_base)[1][3]) && + !isnan((*pm_base)[2][0]) && + !isnan((*pm_base)[2][1]) && + !isnan((*pm_base)[2][2]) && + !isnan((*pm_base)[2][3])); + for (int i = 0; i < pm_bgd->m_v_num; i++) { - MTXMultVec(pm_base, &pm_bgd->m_v_tbl[i], &pm_vtx_tbl[i]); + PSMTXMultVec(*pm_base, &pm_bgd->m_v_tbl[i], &pm_vtx_tbl[i]); } } } } +#if DEBUG +// stripped func, needed for string data +void cBgW::DebugLocalPos() { + OSReport("cBgW::DebugLocalPos() {%ff, %ff, %ff}, {%ff, %ff, %ff}\n"); +} +#endif + bool cBgW::SetVtx() { + #if DEBUG + ASSERT_SOLDHEAP(); + #endif + if (mFlags & NO_VTX_TBL_e) { pm_vtx_tbl = NULL; } else if (mFlags & MOVE_BG_e) { pm_vtx_tbl = (cBgD_Vtx_t*)new Vec[pm_bgd->m_v_num]; if (pm_vtx_tbl == NULL) { + OS_REPORT_ERROR("c_bg_w.cpp[%d] メモリ確保できません。\n", 272); return true; } @@ -103,22 +164,36 @@ void cBgW::CalcPlane() { if (pm_vtx_tbl != NULL) { if (!mNeedsFullTransform) { for (int i = 0; i < pm_bgd->m_t_num; i++) { - pm_tri[i].m_plane.mD -= VECDotProduct(&pm_tri[i].m_plane.mNormal, &mTransVel); + pm_tri[i].m_plane.mD -= PSVECDotProduct(&pm_tri[i].m_plane.mNormal, &mTransVel); } } else { for (int i = 0; i < pm_bgd->m_t_num; i++) { pm_tri[i].m_plane.SetupFrom3Vtx(&pm_vtx_tbl[tri[i].m_vtx_idx0], &pm_vtx_tbl[tri[i].m_vtx_idx1], &pm_vtx_tbl[tri[i].m_vtx_idx2]); - } + + #if DEBUG + cXyz vec; + vec = pm_tri[i].m_plane.mNormal; + + JUT_ASSERT(327, -1.1f <= vec.x && vec.x <= 1.1f); + JUT_ASSERT(328, -1.1f <= vec.y && vec.y <= 1.1f); + JUT_ASSERT(329, -1.1f <= vec.z && vec.z <= 1.1f); + #endif + } } } } bool cBgW::SetTri() { + #if DEBUG + ASSERT_SOLDHEAP(); + #endif + pm_tri = new cBgW_TriElm[pm_bgd->m_t_num]; if (pm_tri == NULL) { + OS_REPORT_ERROR("c_bg_w.cpp[%d] メモリ確保できません\n", 353); return true; } @@ -130,17 +205,17 @@ cBgW_TriElm::~cBgW_TriElm() {} cBgW_TriElm::cBgW_TriElm() {} -void cBgW::BlckConnect(u16* i_start_idx, int* i_prev_idx, int i_idx) { - if (*i_start_idx == 0xFFFF) { - *i_start_idx = i_idx; +void cBgW::BlckConnect(u16* pstart_index, int* pprev_index, int index) { + if (*pstart_index == 0xFFFF) { + *pstart_index = index; } - if (*i_prev_idx != 0xFFFF) { - pm_rwg[*i_prev_idx].m_next = i_idx; + if (*pprev_index != 0xFFFF) { + pm_rwg[*pprev_index].m_next = index; } - *i_prev_idx = i_idx; - pm_rwg[*i_prev_idx].m_next = 0xFFFF; + *pprev_index = index; + pm_rwg[*pprev_index].m_next = 0xFFFF; } void cBgW::ClassifyPlane() { @@ -173,7 +248,7 @@ void cBgW::ClassifyPlane() { if (cBgW_CheckBGround(norm_y)) { BlckConnect(&pm_blk[i].m_gnd_idx, &blk_gnd_idx, j); } else if (cBgW_CheckBRoof(norm_y)) { - if (!ChkRoofRegist()) { + if (ChkRoofRegist()) { BlckConnect(&pm_blk[i].m_roof_idx, &blk_roof_idx, j); } } else { @@ -184,117 +259,110 @@ void cBgW::ClassifyPlane() { } } -void cBgW::MakeBlckTransMinMax(cXyz* i_min, cXyz* i_max) { - VECAdd(i_min, &mTransVel, i_min); - VECAdd(i_max, &mTransVel, i_max); +void cBgW::MakeBlckTransMinMax(cXyz* pmin, cXyz* pmax) { + PSVECAdd(pmin, &mTransVel, pmin); + PSVECAdd(pmax, &mTransVel, pmax); } -void cBgW::MakeBlckMinMax(int vtx_index, cXyz* i_min, cXyz* i_max) { +void cBgW::MakeBlckMinMax(int vtx_index, cXyz* pmin, cXyz* pmax) { Vec* vtx = &pm_vtx_tbl[vtx_index]; - if (i_min->x > vtx->x) { - i_min->x = vtx->x; + if (pmin->x > vtx->x) { + pmin->x = vtx->x; } - if (i_max->x < vtx->x) { - i_max->x = vtx->x; + if (pmax->x < vtx->x) { + pmax->x = vtx->x; } - if (i_min->y > vtx->y) { - i_min->y = vtx->y; + if (pmin->y > vtx->y) { + pmin->y = vtx->y; } - if (i_max->y < vtx->y) { - i_max->y = vtx->y; + if (pmax->y < vtx->y) { + pmax->y = vtx->y; } - if (i_min->z > vtx->z) { - i_min->z = vtx->z; + if (pmin->z > vtx->z) { + pmin->z = vtx->z; } - if (i_max->z < vtx->z) { - i_max->z = vtx->z; + if (pmax->z < vtx->z) { + pmax->z = vtx->z; } } -void cBgW::MakeBlckBnd(int i_blk_idx, cXyz* i_min, cXyz* i_max) { - int start = pm_bgd->m_b_tbl[i_blk_idx].field_0x0; +void cBgW::MakeBlckBnd(int blck_index, cXyz* pmin, cXyz* pmax) { + int start = pm_bgd->m_b_tbl[blck_index].field_0x0; int max; - if (i_blk_idx != pm_bgd->m_b_num - 1) { - max = pm_bgd->m_b_tbl[i_blk_idx + 1].field_0x0 - 1; + if (blck_index != pm_bgd->m_b_num - 1) { + max = pm_bgd->m_b_tbl[blck_index + 1].field_0x0 - 1; } else { max = pm_bgd->m_t_num - 1; } if (mNeedsFullTransform == 0) { - MakeBlckTransMinMax(i_min, i_max); + MakeBlckTransMinMax(pmin, pmax); } else { - i_min->z = G_CM3D_F_INF; - i_min->y = G_CM3D_F_INF; - i_min->x = G_CM3D_F_INF; - i_max->z = -G_CM3D_F_INF; - i_max->y = -G_CM3D_F_INF; - i_max->x = -G_CM3D_F_INF; + pmin->x = pmin->y = pmin->z = G_CM3D_F_INF; + pmax->x = pmax->y = pmax->z =-G_CM3D_F_INF; for (int i = start; i <= max; i++) { - MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx0, i_min, i_max); - MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx1, i_min, i_max); - MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx2, i_min, i_max); + MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx0, pmin, pmax); + MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx1, pmin, pmax); + MakeBlckMinMax(pm_bgd->m_t_tbl[i].m_vtx_idx2, pmin, pmax); } - i_min->x -= 1.0f; - i_min->y -= 1.0f; - i_min->z -= 1.0f; - i_max->x += 1.0f; - i_max->y += 1.0f; - i_max->z += 1.0f; + pmin->x -= 1.0f; + pmin->y -= 1.0f; + pmin->z -= 1.0f; + pmax->x += 1.0f; + pmax->y += 1.0f; + pmax->z += 1.0f; } } -void cBgW::MakeNodeTreeRp(int i_tree_idx) { - cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[i_tree_idx]; +void cBgW::MakeNodeTreeRp(int node_index) { + cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[node_index]; - if (tree_data->m_flag & 1) { - int child_idx = tree_data->m_id[0]; + if (pnode->m_flag & 1) { + int child_idx = pnode->m_id[0]; if (child_idx != 0xFFFF) { - cXyz* max = (cXyz*)pm_node_tree[i_tree_idx].GetMaxP(); - cXyz* min = (cXyz*)pm_node_tree[i_tree_idx].GetMinP(); - - MakeBlckBnd(child_idx, min, max); + MakeBlckBnd(child_idx, pm_node_tree[node_index].GetMinP(), pm_node_tree[node_index].GetMaxP()); } } else { - pm_node_tree[i_tree_idx].ClearForMinMax(); + pm_node_tree[node_index].ClearForMinMax(); for (int i = 0; i < 8; i++) { - int child_idx = tree_data->m_id[i]; + int child_idx = pnode->m_id[i]; if (child_idx != 0xFFFF) { MakeNodeTreeRp(child_idx); - pm_node_tree[i_tree_idx].SetMinMax(*pm_node_tree[child_idx].GetMinP()); - pm_node_tree[i_tree_idx].SetMinMax(*pm_node_tree[child_idx].GetMaxP()); + pm_node_tree[node_index].SetMinMax(*pm_node_tree[child_idx].GetMinP()); + pm_node_tree[node_index].SetMinMax(*pm_node_tree[child_idx].GetMaxP()); } } } } -void cBgW::MakeNodeTreeGrpRp(int i_grp_idx) { - if (pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx != 0xFFFF) { - MakeNodeTreeRp(pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx); - pm_grp[i_grp_idx].m_aab.SetMin( - *pm_node_tree[pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx].GetMinP()); - pm_grp[i_grp_idx].m_aab.SetMax( - *pm_node_tree[pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx].GetMaxP()); +void cBgW::MakeNodeTreeGrpRp(int g) { + if (pm_bgd->m_g_tbl[g].m_tree_idx != 0xFFFF) { + MakeNodeTreeRp(pm_bgd->m_g_tbl[g].m_tree_idx); + pm_grp[g].m_aab.SetMin( + *pm_node_tree[pm_bgd->m_g_tbl[g].m_tree_idx].GetMinP()); + pm_grp[g].m_aab.SetMax( + *pm_node_tree[pm_bgd->m_g_tbl[g].m_tree_idx].GetMaxP()); } - int child_idx = pm_bgd->m_g_tbl[i_grp_idx].m_first_child; + int child_idx = pm_bgd->m_g_tbl[g].m_first_child; while (true) { if (child_idx == 0xFFFF) break; MakeNodeTreeGrpRp(child_idx); - pm_grp[i_grp_idx].m_aab.SetMin(*pm_grp[child_idx].m_aab.GetMinP()); - pm_grp[i_grp_idx].m_aab.SetMax(*pm_grp[child_idx].m_aab.GetMaxP()); + pm_grp[g].m_aab.SetMin(*pm_grp[child_idx].m_aab.GetMinP()); + pm_grp[g].m_aab.SetMax(*pm_grp[child_idx].m_aab.GetMaxP()); child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; } } @@ -333,6 +401,10 @@ bool cBgW::ChkMemoryError() { } bool cBgW::Set(cBgD_t* pbgd, u32 flags, Mtx* pbase_mtx) { + #if DEBUG + ASSERT_SOLDHEAP(); + #endif + mFlags = GLOBAL_e; pm_vtx_tbl = NULL; pm_tri = NULL; @@ -340,7 +412,7 @@ bool cBgW::Set(cBgD_t* pbgd, u32 flags, Mtx* pbase_mtx) { pm_blk = NULL; pm_node_tree = NULL; pm_grp = NULL; - mMoveCounter = cM_rndF(128.0f); + mMoveCounter = (int)cM_rndF(128.0f) & 0xFF; if (pbgd == NULL) { return true; @@ -352,38 +424,43 @@ bool cBgW::Set(cBgD_t* pbgd, u32 flags, Mtx* pbase_mtx) { MTXIdentity(m_inv_mtx); MTXIdentity(m_mtx); } else { - pm_base = *pbase_mtx; - MTXCopy(pm_base, m_inv_mtx); - MTXCopy(pm_base, m_mtx); + pm_base = pbase_mtx; + PSMTXCopy(*pm_base, m_inv_mtx); + PSMTXCopy(*pm_base, m_mtx); } pm_bgd = pbgd; if (SetVtx() || SetTri()) { FreeArea(); + OS_REPORT_ERROR("cBgW::Set() メモリ足りません。\n"); return true; } pm_rwg = new cBgW_RwgElm[pm_bgd->m_t_num]; if (pm_rwg == NULL) { + OS_REPORT_ERROR("c_bg_w.cpp[%d] メモリ確保できません。\n", 892); FreeArea(); return true; } pm_blk = new cBgW_BlkElm[pm_bgd->m_b_num]; if (pm_blk == NULL) { + OS_REPORT_ERROR("c_bg_w.cpp[%d] メモリ確保できません。\n", 914); FreeArea(); return true; } pm_node_tree = new cBgW_NodeTree[pm_bgd->m_tree_num]; if (pm_node_tree == NULL) { + OS_REPORT_ERROR("c_bg_w.cpp[%d] メモリ確保できません\n", 936); FreeArea(); return true; } pm_grp = new cBgW_GrpElm[pm_bgd->m_g_num]; if (pm_grp == NULL) { + OS_REPORT_ERROR("c_bg_w.cpp[%d] メモリ確保できません\n", 958); FreeArea(); return true; } @@ -398,62 +475,73 @@ cBgW_GrpElm::~cBgW_GrpElm() {} cBgW_GrpElm::cBgW_GrpElm() {} -bool cBgW::RwgLineCheck(u16 i_poly_index, cBgS_LinChk* i_linchk) { +bool cBgW::RwgLineCheck(u16 poly_index, cBgS_LinChk* plinchk) { bool chk = false; cM3dGTri tri; while (true) { - cBgD_Tri_t* tri_t = &pm_bgd->m_t_tbl[i_poly_index]; + cBgD_Tri_t* tri_t = &pm_bgd->m_t_tbl[poly_index]; tri.setBg(&pm_vtx_tbl[tri_t->m_vtx_idx0], &pm_vtx_tbl[tri_t->m_vtx_idx1], - &pm_vtx_tbl[tri_t->m_vtx_idx2], &pm_tri[i_poly_index].m_plane); + &pm_vtx_tbl[tri_t->m_vtx_idx2], &pm_tri[poly_index].m_plane); - cXyz cross_pos; - if (tri.cross(i_linchk->GetLinP(), &cross_pos, i_linchk->ChkFrontFlag(), - i_linchk->ChkBackFlag())) + cXyz cross; + if (tri.cross(plinchk->GetLinP(), &cross, plinchk->ChkFrontFlag(), + plinchk->ChkBackFlag())) { - if (!ChkPolyThrough(i_poly_index, i_linchk->GetPolyPassChk())) { - i_linchk->SetCross(cross_pos); - i_linchk->SetPolyIndex(i_poly_index); + if (!ChkPolyThrough(poly_index, plinchk->GetPolyPassChk())) { + JUT_ASSERT(1080, !isnan(cross.x)); + JUT_ASSERT(1081, !isnan(cross.y)); + JUT_ASSERT(1082, !isnan(cross.z)); + JUT_ASSERT(1088, -INF < cross.x && cross.x < INF && -INF < cross.y && cross.y < INF && -INF < cross.z && cross.z < INF); + + plinchk->SetCross(cross); + plinchk->SetPolyIndex(poly_index); chk = true; } } - if (pm_rwg[i_poly_index].m_next == 0xFFFF) { + cBgW_RwgElm* element = &pm_rwg[poly_index]; + if (element->m_next == 0xFFFF) { break; } - i_poly_index = pm_rwg[i_poly_index].m_next; + + poly_index = element->m_next; } return chk; } -bool cBgW::LineCheckRp(cBgS_LinChk* i_linchk, int i_idx) { - cBgW_NodeTree* node = &pm_node_tree[i_idx]; +bool cBgW::LineCheckRp(cBgS_LinChk* plinchk, int node_index) { + cBgW_NodeTree* node = &pm_node_tree[node_index]; if (!cM3d_Cross_MinMaxBoxLine(node->GetMinP(), node->GetMaxP(), - &i_linchk->GetLinP()->GetStartP(), - &i_linchk->GetLinP()->GetEndP())) + &plinchk->GetLinP()->GetStartP(), + &plinchk->GetLinP()->GetEndP())) { return false; } - cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[i_idx]; + cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[node_index]; bool chk = false; - if (tree->m_flag & 1) { - if (i_linchk->GetPreWallChk() && pm_blk[tree->m_id[0]].m_wall_idx != 0xFFFF && - RwgLineCheck(pm_blk[tree->m_id[0]].m_wall_idx, i_linchk)) + if (pnode->m_flag & 1) { + JUT_ASSERT(1140, pnode->m_id[0] != 0xffff); + + JUT_ASSERT(1142, pnode->m_id[0] >= 0 && pnode->m_id[0] < pm_bgd->m_b_num); + + if (plinchk->GetPreWallChk() && pm_blk[pnode->m_id[0]].m_wall_idx != 0xFFFF && + RwgLineCheck(pm_blk[pnode->m_id[0]].m_wall_idx, plinchk)) { chk = true; } - if (i_linchk->GetPreGroundChk() && pm_blk[tree->m_id[0]].m_gnd_idx != 0xFFFF && - RwgLineCheck(pm_blk[tree->m_id[0]].m_gnd_idx, i_linchk)) + if (plinchk->GetPreGroundChk() && pm_blk[pnode->m_id[0]].m_gnd_idx != 0xFFFF && + RwgLineCheck(pm_blk[pnode->m_id[0]].m_gnd_idx, plinchk)) { chk = true; } - if (i_linchk->GetPreRoofChk() && pm_blk[tree->m_id[0]].m_roof_idx != 0xFFFF && - RwgLineCheck(pm_blk[tree->m_id[0]].m_roof_idx, i_linchk)) + if (plinchk->GetPreRoofChk() && pm_blk[pnode->m_id[0]].m_roof_idx != 0xFFFF && + RwgLineCheck(pm_blk[pnode->m_id[0]].m_roof_idx, plinchk)) { chk = true; } @@ -462,7 +550,7 @@ bool cBgW::LineCheckRp(cBgS_LinChk* i_linchk, int i_idx) { } for (int i = 0; i < 8; i++) { - if (tree->m_id[i] != 0xFFFF && LineCheckRp(i_linchk, tree->m_id[i])) { + if (pnode->m_id[i] != 0xFFFF && LineCheckRp(plinchk, pnode->m_id[i])) { chk = true; } } @@ -470,30 +558,31 @@ bool cBgW::LineCheckRp(cBgS_LinChk* i_linchk, int i_idx) { return chk; } -bool cBgW::LineCheckGrpRp(cBgS_LinChk* i_linchk, int i_grp_idx, int depth) { - cM3dGLin* pline = i_linchk->GetLinP(); - if (!pm_grp[i_grp_idx].m_aab.Cross(pline)) { +bool cBgW::LineCheckGrpRp(cBgS_LinChk* plinchk, int g, int depth) { + if (!pm_grp[g].m_aab.Cross(plinchk->GetLinP())) { return false; } - if (ChkGrpThrough(i_grp_idx, i_linchk->GetGrpPassChk(), depth)) { + if (ChkGrpThrough(g, plinchk->GetGrpPassChk(), depth)) { return false; } bool chk = false; - if (pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx != 0xFFFF && - LineCheckRp(i_linchk, pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx)) + if (pm_bgd->m_g_tbl[g].m_tree_idx != 0xFFFF && + LineCheckRp(plinchk, pm_bgd->m_g_tbl[g].m_tree_idx)) { chk = true; } - int child_idx = pm_bgd->m_g_tbl[i_grp_idx].m_first_child; + int child_idx = pm_bgd->m_g_tbl[g].m_first_child; + depth++; + while (true) { if (child_idx == 0xFFFF) break; - if (LineCheckGrpRp(i_linchk, child_idx, depth + 1)) { + if (LineCheckGrpRp(plinchk, child_idx, depth)) { chk = true; } child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; @@ -502,19 +591,23 @@ bool cBgW::LineCheckGrpRp(cBgS_LinChk* i_linchk, int i_grp_idx, int depth) { return chk; } -bool cBgW::LineCheck(cBgS_LinChk* i_linchk) { - return LineCheckGrpRp(i_linchk, m_rootGrpIdx, 1); +bool cBgW::LineCheck(cBgS_LinChk* plinchk) { + return LineCheckGrpRp(plinchk, m_rootGrpIdx, 1); } -bool cBgW::RwgGroundCheckCommon(f32 i_yPos, u16 i_poly_idx, cBgS_GndChk* i_gndchk) { - if (i_yPos < i_gndchk->GetPointP().y && i_yPos > i_gndchk->GetNowY()) { - cBgD_Tri_t* tri = &pm_bgd->m_t_tbl[i_poly_idx]; +bool cBgW::RwgGroundCheckCommon(f32 cy, u16 poly_index, cBgS_GndChk* pgndchk) { + if (cy < pgndchk->GetPointP().y && cy > pgndchk->GetNowY()) { + cBgD_Tri_t* tri = &pm_bgd->m_t_tbl[poly_index]; if (cM3d_CrossY_Tri_Front(pm_vtx_tbl[tri->m_vtx_idx0], pm_vtx_tbl[tri->m_vtx_idx1], - pm_vtx_tbl[tri->m_vtx_idx2], (const Vec*)&i_gndchk->GetPointP())) + pm_vtx_tbl[tri->m_vtx_idx2], (const Vec*)&pgndchk->GetPointP())) { - if (!ChkPolyThrough(i_poly_idx, i_gndchk->GetPolyPassChk())) { - i_gndchk->SetNowY(i_yPos); - i_gndchk->SetPolyIndex(i_poly_idx); + if (!ChkPolyThrough(poly_index, pgndchk->GetPolyPassChk())) { + pgndchk->SetNowY(cy); + pgndchk->SetPolyIndex(poly_index); + + JUT_ASSERT(1278, !isnan(cy)); + + JUT_ASSERT(1280, -INF < cy && cy < INF); return true; } } @@ -523,55 +616,61 @@ bool cBgW::RwgGroundCheckCommon(f32 i_yPos, u16 i_poly_idx, cBgS_GndChk* i_gndch return false; } -bool cBgW::RwgGroundCheckGnd(u16 i_poly_idx, cBgS_GndChk* i_gndchk) { +bool cBgW::RwgGroundCheckGnd(u16 poly_index, cBgS_GndChk* pgndchk) { bool chk = false; while (true) { - cBgW_RwgElm* rwg = &pm_rwg[i_poly_idx]; - f32 tri_y = pm_tri[i_poly_idx].m_plane.getCrossY_NonIsZero(&i_gndchk->GetPointP()); - if (RwgGroundCheckCommon(tri_y, (u32)i_poly_idx, i_gndchk)) { + cBgW_RwgElm* rwg = &pm_rwg[poly_index]; + f32 tri_y = pm_tri[poly_index].m_plane.getCrossY_NonIsZero(pgndchk->GetPointP()); + if (RwgGroundCheckCommon(tri_y, (u32)poly_index, pgndchk)) { chk = true; } if (rwg->m_next == 0xFFFF) break; - i_poly_idx = rwg->m_next; + poly_index = rwg->m_next; } return chk; } -bool cBgW::RwgGroundCheckWall(u16 i_poly_idx, cBgS_GndChk* i_gndchk) { +bool cBgW::RwgGroundCheckWall(u16 poly_index, cBgS_GndChk* pgndchk) { bool chk = false; while (true) { - cBgW_TriElm* tri = &pm_tri[i_poly_idx]; - cBgW_RwgElm* rwg = &pm_rwg[i_poly_idx]; + cBgW_TriElm* tri = &pm_tri[poly_index]; + cBgW_RwgElm* rwg = &pm_rwg[poly_index]; if (tri->m_plane.mNormal.y >= 0.014f) { - f32 tri_y = tri->m_plane.getCrossY_NonIsZero(&i_gndchk->GetPointP()); - if (RwgGroundCheckCommon(tri_y, (u32)i_poly_idx, i_gndchk)) { + f32 tri_y = tri->m_plane.getCrossY_NonIsZero(pgndchk->GetPointP()); + if (RwgGroundCheckCommon(tri_y, (u32)poly_index, pgndchk)) { chk = true; } } if (rwg->m_next == 0xFFFF) break; - i_poly_idx = rwg->m_next; + poly_index = rwg->m_next; } return chk; } -bool cBgW::GroundCrossRp(cBgS_GndChk* i_gndchk, int i_idx) { +bool cBgW::GroundCrossRp(cBgS_GndChk* pgndchk, int node_index) { + JUT_ASSERT(1376, 0 <= node_index && node_index < pm_bgd->m_tree_num); + bool chk = false; - cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[i_idx]; - if ((tree->m_flag & 1)) { - if (pm_blk[tree->m_id[0]].m_gnd_idx != 0xFFFF && - RwgGroundCheckGnd(pm_blk[tree->m_id[0]].m_gnd_idx, i_gndchk)) + cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[node_index]; + if ((pnode->m_flag & 1)) { + JUT_ASSERT(1386, pnode->m_id[0] != 0xffff); + + JUT_ASSERT(1387, pnode->m_id[0] >= 0 && pnode->m_id[0] < pm_bgd->m_b_num); + + if (pm_blk[pnode->m_id[0]].m_gnd_idx != 0xFFFF && + RwgGroundCheckGnd(pm_blk[pnode->m_id[0]].m_gnd_idx, pgndchk)) { chk = true; } - if (i_gndchk->GetWallPrecheck() && pm_blk[tree->m_id[0]].m_wall_idx != 0xFFFF && - RwgGroundCheckWall(pm_blk[tree->m_id[0]].m_wall_idx, i_gndchk)) + if (pgndchk->GetWallPrecheck() && pm_blk[pnode->m_id[0]].m_wall_idx != 0xFFFF && + RwgGroundCheckWall(pm_blk[pnode->m_id[0]].m_wall_idx, pgndchk)) { chk = true; } @@ -579,12 +678,12 @@ bool cBgW::GroundCrossRp(cBgS_GndChk* i_gndchk, int i_idx) { } for (int i = 0; i < 8; i++) { - if (tree->m_id[i] != 0xFFFF) { - cM3dGAab* aab = &pm_node_tree[tree->m_id[i]]; - if (aab->CrossY(&i_gndchk->GetPointP())) { - if (aab->UnderPlaneYUnder(i_gndchk->GetPointP().y)) { - if (!aab->TopPlaneYUnder(i_gndchk->GetNowY()) && - GroundCrossRp(i_gndchk, tree->m_id[i])) + if (pnode->m_id[i] != 0xFFFF) { + cM3dGAab* aab = &pm_node_tree[pnode->m_id[i]]; + if (aab->CrossY(&pgndchk->GetPointP())) { + if (aab->UnderPlaneYUnder(pgndchk->GetPointP().y)) { + if (!aab->TopPlaneYUnder(pgndchk->GetNowY()) && + GroundCrossRp(pgndchk, pnode->m_id[i])) { chk = true; } @@ -596,33 +695,36 @@ bool cBgW::GroundCrossRp(cBgS_GndChk* i_gndchk, int i_idx) { return chk; } -bool cBgW::GroundCrossGrpRp(cBgS_GndChk* i_gndchk, int i_grp_idx, int i_depth) { - cBgW_GrpElm* grp = &pm_grp[i_grp_idx]; - if (!grp->m_aab.CrossY(&i_gndchk->GetPointP()) || - !grp->m_aab.UnderPlaneYUnder(i_gndchk->GetPointP().y) || - grp->m_aab.TopPlaneYUnder(i_gndchk->GetNowY())) +bool cBgW::GroundCrossGrpRp(cBgS_GndChk* pgndchk, int g, int depth) { + JUT_ASSERT(1441, 0 <= g && g < pm_bgd->m_g_num); + + cBgW_GrpElm* grp = &pm_grp[g]; + if (!grp->m_aab.CrossY(&pgndchk->GetPointP()) || + !grp->m_aab.UnderPlaneYUnder(pgndchk->GetPointP().y) || + grp->m_aab.TopPlaneYUnder(pgndchk->GetNowY())) { return false; } - if (ChkGrpThrough(i_grp_idx, i_gndchk->GetGrpPassChk(), i_depth)) { + if (ChkGrpThrough(g, pgndchk->GetGrpPassChk(), depth)) { return false; } bool chk = false; - if (pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx != 0xFFFF && - GroundCrossRp(i_gndchk, pm_bgd->m_g_tbl[i_grp_idx].m_tree_idx)) + if (pm_bgd->m_g_tbl[g].m_tree_idx != 0xFFFF && + GroundCrossRp(pgndchk, pm_bgd->m_g_tbl[g].m_tree_idx)) { chk = true; } - int child_idx = pm_bgd->m_g_tbl[i_grp_idx].m_first_child; + int child_idx = pm_bgd->m_g_tbl[g].m_first_child; + depth++; while (true) { if (child_idx == 0xFFFF) break; - if (GroundCrossGrpRp(i_gndchk, child_idx, i_depth + 1)) { + if (GroundCrossGrpRp(pgndchk, child_idx, depth)) { chk = true; } @@ -632,38 +734,38 @@ bool cBgW::GroundCrossGrpRp(cBgS_GndChk* i_gndchk, int i_grp_idx, int i_depth) { return chk; } -bool cBgW::GroundCross(cBgS_GndChk* i_gndchk) { - return GroundCrossGrpRp(i_gndchk, m_rootGrpIdx, 1); +bool cBgW::GroundCross(cBgS_GndChk* pgndchk) { + return GroundCrossGrpRp(pgndchk, m_rootGrpIdx, 1); } void cBgW::CopyOldMtx() { if (pm_base != NULL) { - MTXCopy(m_mtx, m_inv_mtx); - MTXCopy(pm_base, m_mtx); + PSMTXCopy(m_mtx, m_inv_mtx); + PSMTXCopy(*pm_base, m_mtx); } } void cBgW::Move() { if (!ChkLock() && (mFlags & MOVE_BG_e)) { if (!ChkNoCalcVtx()) { - if (mMoveCounter >= 0xFF || m_mtx[0][0] != pm_base[0][0] || - m_mtx[0][1] != pm_base[0][1] || m_mtx[0][2] != pm_base[0][2] || - m_mtx[1][0] != pm_base[1][0] || m_mtx[1][1] != pm_base[1][1] || - m_mtx[1][2] != pm_base[1][2] || m_mtx[2][0] != pm_base[2][0] || - m_mtx[2][1] != pm_base[2][1] || m_mtx[2][2] != pm_base[2][2]) + if (mMoveCounter >= 0xFF || m_mtx[0][0] != (*pm_base)[0][0] || + m_mtx[0][1] != (*pm_base)[0][1] || m_mtx[0][2] != (*pm_base)[0][2] || + m_mtx[1][0] != (*pm_base)[1][0] || m_mtx[1][1] != (*pm_base)[1][1] || + m_mtx[1][2] != (*pm_base)[1][2] || m_mtx[2][0] != (*pm_base)[2][0] || + m_mtx[2][1] != (*pm_base)[2][1] || m_mtx[2][2] != (*pm_base)[2][2]) { mNeedsFullTransform = 1; - } else if (m_mtx[0][3] == pm_base[0][3] && m_mtx[1][3] == pm_base[1][3] && - m_mtx[2][3] == pm_base[2][3]) + } else if (m_mtx[0][3] == (*pm_base)[0][3] && m_mtx[1][3] == (*pm_base)[1][3] && + m_mtx[2][3] == (*pm_base)[2][3]) { - MTXCopy(pm_base, m_inv_mtx); + PSMTXCopy(*pm_base, m_inv_mtx); if (!ChkFlush()) { return; } } else { - mTransVel.x = pm_base[0][3] - m_mtx[0][3]; - mTransVel.y = pm_base[1][3] - m_mtx[1][3]; - mTransVel.z = pm_base[2][3] - m_mtx[2][3]; + mTransVel.x = (*pm_base)[0][3] - m_mtx[0][3]; + mTransVel.y = (*pm_base)[1][3] - m_mtx[1][3]; + mTransVel.z = (*pm_base)[2][3] - m_mtx[2][3]; mNeedsFullTransform = 0; } @@ -682,63 +784,80 @@ void cBgW::Move() { } } -void cBgW::RwgShdwDraw(int i_idx, cBgS_ShdwDraw* i_shdw) { +static void dummyString() { + OSReport("Label:%s\n"); + OSReport("cBgW:%x\n"); + OSReport("vtx num:%d\n"); + OSReport("(%f,%f,%f)\n"); +} + +void cBgW::RwgShdwDraw(int index, cBgS_ShdwDraw* pshdw) { + cBgW_RwgElm* rwg; + while (true) { - cBgW_RwgElm* rwg = &pm_rwg[i_idx]; - if (!ChkShdwDrawThrough(i_idx, i_shdw->GetPolyPassChk())) { - (i_shdw->mCallbackFun)(i_shdw, pm_vtx_tbl, pm_bgd->m_t_tbl[i_idx].m_vtx_idx0, - pm_bgd->m_t_tbl[i_idx].m_vtx_idx1, - pm_bgd->m_t_tbl[i_idx].m_vtx_idx2, &pm_tri[i_idx].m_plane); + rwg = &pm_rwg[index]; + if (!ChkShdwDrawThrough(index, pshdw->GetPolyPassChk())) { + #if DEBUG + pshdw->field_0x34++; + #endif + + (pshdw->mCallbackFun)(pshdw, pm_vtx_tbl, pm_bgd->m_t_tbl[index].m_vtx_idx0, + pm_bgd->m_t_tbl[index].m_vtx_idx1, + pm_bgd->m_t_tbl[index].m_vtx_idx2, &pm_tri[index].m_plane); } if (rwg->m_next == 0xFFFF) break; - i_idx = rwg->m_next; + + index = rwg->m_next; + JUT_ASSERT(1681, 0 <= index && index < pm_bgd->m_t_num); } } -void cBgW::ShdwDrawRp(cBgS_ShdwDraw* i_shdw, int i_idx) { - if (pm_node_tree[i_idx].Cross(i_shdw->GetBndP())) { - cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[i_idx]; +void cBgW::ShdwDrawRp(cBgS_ShdwDraw* pshdw, int node_index) { + if (pm_node_tree[node_index].Cross(pshdw->GetBndP())) { + cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[node_index]; if ((tree->m_flag & 1)) { if (pm_blk[tree->m_id[0]].m_wall_idx != 0xFFFF) { - RwgShdwDraw(pm_blk[tree->m_id[0]].m_wall_idx, i_shdw); + RwgShdwDraw(pm_blk[tree->m_id[0]].m_wall_idx, pshdw); } if (pm_blk[tree->m_id[0]].m_roof_idx != 0xFFFF) { - RwgShdwDraw(pm_blk[tree->m_id[0]].m_roof_idx, i_shdw); + RwgShdwDraw(pm_blk[tree->m_id[0]].m_roof_idx, pshdw); } if (pm_blk[tree->m_id[0]].m_gnd_idx != 0xFFFF) { - RwgShdwDraw(pm_blk[tree->m_id[0]].m_gnd_idx, i_shdw); + RwgShdwDraw(pm_blk[tree->m_id[0]].m_gnd_idx, pshdw); } } else { for (int i = 0; i < 8; i++) { if (tree->m_id[i] != 0xFFFF) { - ShdwDrawRp(i_shdw, tree->m_id[i]); + ShdwDrawRp(pshdw, tree->m_id[i]); } } } } } -void cBgW::ShdwDrawGrpRp(cBgS_ShdwDraw* i_shdw, int i_idx) { - if (pm_grp[i_idx].m_aab.Cross(i_shdw->GetBndP())) { - if (pm_bgd->m_g_tbl[i_idx].m_tree_idx != 0xFFFF) { - ShdwDrawRp(i_shdw, pm_bgd->m_g_tbl[i_idx].m_tree_idx); +void cBgW::ShdwDrawGrpRp(cBgS_ShdwDraw* pshdw, int node_index) { + int child_idx; + + if (pm_grp[node_index].m_aab.Cross(pshdw->GetBndP())) { + if (pm_bgd->m_g_tbl[node_index].m_tree_idx != 0xFFFF) { + ShdwDrawRp(pshdw, pm_bgd->m_g_tbl[node_index].m_tree_idx); } - int child_idx = pm_bgd->m_g_tbl[i_idx].m_first_child; + child_idx = pm_bgd->m_g_tbl[node_index].m_first_child; while (true) { if (child_idx == 0xFFFF) { break; } - ShdwDrawGrpRp(i_shdw, child_idx); + ShdwDrawGrpRp(pshdw, child_idx); child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; } } } -void cBgW::ShdwDraw(cBgS_ShdwDraw* i_shdw) { - ShdwDrawGrpRp(i_shdw, m_rootGrpIdx); +void cBgW::ShdwDraw(cBgS_ShdwDraw* pshdw) { + ShdwDrawGrpRp(pshdw, m_rootGrpIdx); } bool cBgW::ChkPolyThrough(int param_0, cBgS_PolyPassChk* param_1) { @@ -753,16 +872,18 @@ bool cBgW::ChkGrpThrough(int param_0, cBgS_GrpPassChk* param_1, int param_2) { return false; } -int cBgW::GetGrpRoomIndex(cBgS_PolyInfo const& poly) const { - int grp_index = GetTriGrp(poly.GetPolyIndex()); +int cBgW::GetGrpRoomIndex(const cBgS_PolyInfo& polyinfo) const { + int poly_index = polyinfo.GetPolyIndex(); + JUT_ASSERT(1848, 0 <= poly_index && poly_index < pm_bgd->m_t_num); - u16 parent_idx = pm_bgd->m_g_tbl[grp_index].m_parent; + int grp_index = GetTriGrp(poly_index); + JUT_ASSERT(1850, 0 <= grp_index && grp_index < pm_bgd->m_g_num); - if (parent_idx == 0xFFFF || pm_bgd->m_g_tbl[parent_idx].m_parent == 0xFFFF) { + if (pm_bgd->m_g_tbl[grp_index].m_parent == 0xFFFF || pm_bgd->m_g_tbl[pm_bgd->m_g_tbl[grp_index].m_parent].m_parent == 0xFFFF) { return 0xFF; } - int room_index = pm_bgd->m_g_tbl[pm_bgd->m_g_tbl[parent_idx].m_parent].m_room_id; + int room_index = pm_bgd->m_g_tbl[pm_bgd->m_g_tbl[pm_bgd->m_g_tbl[grp_index].m_parent].m_parent].m_room_id; if (room_index >= 0xFF) { room_index = 0xFF; } @@ -774,79 +895,91 @@ cM3dGAab* cBgW::GetBnd() const { return &pm_grp[m_rootGrpIdx].m_aab; } -void cBgW::GetTrans(cXyz* o_trans) const { - MtxP base = pm_base; - o_trans->x = base[0][3] - m_inv_mtx[0][3]; - o_trans->y = base[1][3] - m_inv_mtx[1][3]; - o_trans->z = base[2][3] - m_inv_mtx[2][3]; +void cBgW::GetTrans(cXyz* ptrans) const { + ptrans->x = (*pm_base)[0][3] - m_inv_mtx[0][3]; + ptrans->y = (*pm_base)[1][3] - m_inv_mtx[1][3]; + ptrans->z = (*pm_base)[2][3] - m_inv_mtx[2][3]; } -bool cBgW::GetTriPnt(cBgS_PolyInfo const& poly, cXyz* o_pntA, cXyz* o_pntB, cXyz* o_pntC) const { - int poly_index = poly.GetPolyIndex(); +bool cBgW::GetTriPnt(const cBgS_PolyInfo& polyinfo, cXyz* ppnt0, cXyz* ppnt1, cXyz* ppnt2) const { + JUT_ASSERT(1923, pm_bgd != NULL); + + int poly_index = polyinfo.GetPolyIndex(); cBgD_Tri_t* tri = &pm_bgd->m_t_tbl[poly_index]; - o_pntA->set(pm_vtx_tbl[tri->m_vtx_idx0]); - o_pntB->set(pm_vtx_tbl[tri->m_vtx_idx1]); - o_pntC->set(pm_vtx_tbl[tri->m_vtx_idx2]); + ppnt0->set(pm_vtx_tbl[tri->m_vtx_idx0]); + ppnt1->set(pm_vtx_tbl[tri->m_vtx_idx1]); + ppnt2->set(pm_vtx_tbl[tri->m_vtx_idx2]); return true; } -void cBgW::GetTopUnder(f32* o_top, f32* o_under) const { - *o_under = pm_grp[m_rootGrpIdx].m_aab.GetMinP()->y; - *o_top = pm_grp[m_rootGrpIdx].m_aab.GetMaxP()->y; +void cBgW::GetTopUnder(f32* ptop, f32* punder) const { + *punder = pm_grp[m_rootGrpIdx].m_aab.GetMinP()->y; + *ptop = pm_grp[m_rootGrpIdx].m_aab.GetMaxP()->y; } -cM3dGPla cBgW::GetTriPla(cBgS_PolyInfo const& poly) const { - int poly_index = poly.GetPolyIndex(); +cM3dGPla cBgW::GetTriPla(const cBgS_PolyInfo& polyinfo) const { + int poly_index = polyinfo.GetPolyIndex(); JUT_ASSERT(1956, 0 <= poly_index && poly_index < pm_bgd->m_t_num); return pm_tri[poly_index].m_plane; } -u32 cBgW::GetGrpInf(cBgS_PolyInfo const& poly) const { - int grp = GetTriGrp(poly.GetPolyIndex()); - return pm_bgd->m_g_tbl[grp].m_info; +u32 cBgW::GetGrpInf(const cBgS_PolyInfo& polyinfo) const { + int poly_index = polyinfo.GetPolyIndex(); + JUT_ASSERT(1969, 0 <= poly_index && poly_index < pm_bgd->m_t_num); + + int grp_id = GetTriGrp(poly_index); + JUT_ASSERT(1971, 0 <= grp_id && grp_id < pm_bgd->m_g_num); + + return pm_bgd->m_g_tbl[grp_id].m_info; } int cBgW::GetPolyInfId(int poly_index) const { + JUT_ASSERT(1983, 0 <= poly_index && poly_index < pm_bgd->m_t_num); + return pm_bgd->m_t_tbl[poly_index].m_id; } u32 cBgW::GetPolyInf0(int poly_index, u32 mask, u32 shift) const { int id = GetPolyInfId(poly_index); + JUT_ASSERT(2024, 0 <= id && id < pm_bgd->m_ti_num); + return (pm_bgd->m_ti_tbl[id].m_info0 & mask) >> shift; } u32 cBgW::GetMaskPolyInf0_NoShift(int poly_index, u32 mask) const { int id = GetPolyInfId(poly_index); + JUT_ASSERT(2039, 0 <= id && id < pm_bgd->m_ti_num); + return (pm_bgd->m_ti_tbl[id].m_info0 & mask); } -int dBgW::GetExitId(cBgS_PolyInfo const& poly) { - return GetPolyInf0(poly.GetPolyIndex(), 0x3F, 0); +int dBgW::GetExitId(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf0(polyinfo.GetPolyIndex(), 0x3F, 0); } -int dBgW::GetPolyColor(cBgS_PolyInfo const& poly) { - return GetPolyInf0(poly.GetPolyIndex(), 0x3FC0, 6); +int dBgW::GetPolyColor(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf0(polyinfo.GetPolyIndex(), 0x3FC0, 6); } -BOOL dBgW::GetHorseNoEntry(cBgS_PolyInfo const& poly) { - return GetPolyInf0(poly.GetPolyIndex(), 0x200000, 21); +BOOL dBgW::GetHorseNoEntry(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf0(polyinfo.GetPolyIndex(), 0x200000, 21); } -int dBgW::GetSpecialCode(cBgS_PolyInfo const& poly) { - return GetSpecialCode(poly.GetPolyIndex()); +int dBgW::GetSpecialCode(const cBgS_PolyInfo& polyinfo) { + return GetSpecialCode(polyinfo.GetPolyIndex()); } int dBgW::GetSpecialCode(int poly_index) { return GetPolyInf0(poly_index, 0xF000000, 24); } -int dBgW::GetMagnetCode(cBgS_PolyInfo const& poly) { - return GetPolyInf0(poly.GetPolyIndex(), 0x30000000, 28); +int dBgW::GetMagnetCode(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf0(polyinfo.GetPolyIndex(), 0x30000000, 28); } -int dBgW::GetMonkeyBarsCode(cBgS_PolyInfo const& poly) { - return GetPolyInf0(poly.GetPolyIndex(), 0x80000000, 31); +int dBgW::GetMonkeyBarsCode(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf0(polyinfo.GetPolyIndex(), 0x80000000, 31); } u32 dBgW::GetPolyObjThrough(int poly_index) { @@ -891,31 +1024,35 @@ u32 dBgW::GetUnderwaterRoofCode(int poly_index) { u32 cBgW::GetPolyInf1(int poly_index, u32 mask, u32 shift) const { int id = GetPolyInfId(poly_index); + JUT_ASSERT(2259, 0 <= id && id < pm_bgd->m_ti_num); + return (pm_bgd->m_ti_tbl[id].m_info1 & mask) >> shift; } -int dBgW::GetLinkNo(cBgS_PolyInfo const& poly) { - return GetPolyInf1(poly.GetPolyIndex(), 0xFF, 0); +int dBgW::GetLinkNo(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf1(polyinfo.GetPolyIndex(), 0xFF, 0); } -int dBgW::GetWallCode(cBgS_PolyInfo const& poly) { - return GetPolyInf1(poly.GetPolyIndex(), 0xF00, 8); +int dBgW::GetWallCode(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf1(polyinfo.GetPolyIndex(), 0xF00, 8); } -int dBgW::GetPolyAtt0(cBgS_PolyInfo const& poly) { - return GetPolyInf1(poly.GetPolyIndex(), 0xF000, 12); +int dBgW::GetPolyAtt0(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf1(polyinfo.GetPolyIndex(), 0xF000, 12); } -int dBgW::GetPolyAtt1(cBgS_PolyInfo const& poly) { - return GetPolyInf1(poly.GetPolyIndex(), 0x70000, 16); +int dBgW::GetPolyAtt1(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf1(polyinfo.GetPolyIndex(), 0x70000, 16); } -int dBgW::GetGroundCode(cBgS_PolyInfo const& poly) { - return GetPolyInf1(poly.GetPolyIndex(), 0xF80000, 19); +int dBgW::GetGroundCode(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf1(polyinfo.GetPolyIndex(), 0xF80000, 19); } u32 cBgW::GetMaskPolyInf1_NoShift(int poly_index, u32 mask) const { int id = GetPolyInfId(poly_index); + JUT_ASSERT(2324, 0 <= id && id < pm_bgd->m_ti_num); + return (pm_bgd->m_ti_tbl[id].m_info1 & mask); } @@ -929,26 +1066,30 @@ u32 dBgW::GetAttackThrough(int poly_index) { u32 cBgW::GetPolyInf2(int poly_index, u32 mask, u32 shift) const { int id = GetPolyInfId(poly_index); + JUT_ASSERT(2368, 0 <= id && id < pm_bgd->m_ti_num); + return (pm_bgd->m_ti_tbl[id].m_info2 & mask) >> shift; } -int dBgW::GetCamMoveBG(cBgS_PolyInfo const& poly) { - return GetPolyInf2(poly.GetPolyIndex(), 0xFF, 0); +int dBgW::GetCamMoveBG(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf2(polyinfo.GetPolyIndex(), 0xFF, 0); } -int dBgW::GetRoomCamId(cBgS_PolyInfo const& poly) { - return GetPolyInf2(poly.GetPolyIndex(), 0xFF00, 8); +int dBgW::GetRoomCamId(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf2(polyinfo.GetPolyIndex(), 0xFF00, 8); } -int dBgW::GetRoomPathId(cBgS_PolyInfo const& poly) { - return GetPolyInf2(poly.GetPolyIndex(), 0xFF0000, 16); +int dBgW::GetRoomPathId(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf2(polyinfo.GetPolyIndex(), 0xFF0000, 16); } -int dBgW::GetRoomPathPntNo(cBgS_PolyInfo const& poly) { - return GetPolyInf2(poly.GetPolyIndex(), 0xFF000000, 24); +int dBgW::GetRoomPathPntNo(const cBgS_PolyInfo& polyinfo) { + return GetPolyInf2(polyinfo.GetPolyIndex(), 0xFF000000, 24); } int cBgW::GetTriGrp(int poly_index) const { + JUT_ASSERT(2440, 0 <= poly_index && poly_index < pm_bgd->m_t_num); + return pm_bgd->m_t_tbl[poly_index].m_grp; } @@ -964,6 +1105,111 @@ bool cBgW::ChkMoveBg() const { return mFlags & MOVE_BG_e; } +#if DEBUG +void dBgW::DrawBox() const { + cXyz min; + cXyz max; + cXyz points[8]; + + min = *pm_grp[m_rootGrpIdx].m_aab.GetMinP(); + max = *pm_grp[m_rootGrpIdx].m_aab.GetMaxP(); + + points[0].x = min.x; + points[0].y = max.y; + points[0].z = min.z; + + points[1].x = max.x; + points[1].y = max.y; + points[1].z = min.z; + + points[2].x = min.x; + points[2].y = max.y; + points[2].z = max.z; + + points[3].x = max.x; + points[3].y = max.y; + points[3].z = max.z; + + points[4].x = min.x; + points[4].y = min.y; + points[4].z = min.z; + + points[5].x = max.x; + points[5].y = min.y; + points[5].z = min.z; + + points[6].x = min.x; + points[6].y = min.y; + points[6].z = max.z; + + points[7].x = max.x; + points[7].y = min.y; + points[7].z = max.z; + + dDbVw_drawCube8pXlu(points, (GXColor){0, 0xFF, 0, 0x64}); +} + +void dBgW::DebugDraw() const { + GXColor ground_color = {0xFF, 0, 0, 0x80}; + GXColor roof_color = {0, 0, 0xFF, 0x80}; + GXColor wall_color = {0, 0xFF, 0, 0x80}; + + cBgD_Tri_t* t_tbl = pm_bgd->m_t_tbl; + for (int i = 0; i < pm_bgd->m_t_num; i++) { + cXyz normal; + normal = pm_tri[i].m_plane.mNormal; + + cBgD_Vtx_t* v0 = &pm_vtx_tbl[t_tbl[i].m_vtx_idx0]; + cBgD_Vtx_t* v1 = &pm_vtx_tbl[t_tbl[i].m_vtx_idx1]; + cBgD_Vtx_t* v2 = &pm_vtx_tbl[t_tbl[i].m_vtx_idx2]; + + cXyz points[3]; + points[0].set(*v0); + points[1].set(*v1); + points[2].set(*v2); + + points[0] += normal; + points[1] += normal; + points[2] += normal; + + GXColor* pcolor; + if (cBgW_CheckBGround(normal.y)) { + pcolor = &ground_color; + } else if (cBgW_CheckBRoof(normal.y)) { + pcolor = &roof_color; + } else { + pcolor = &wall_color; + } + + dDbVw_drawTriangleXlu(points, *pcolor, TRUE); + } +} + +void dBgW::DrawPoly(const cBgS_PolyInfo& polyinfo, const GXColor& color) const { + int poly_index = polyinfo.GetPolyIndex(); + JUT_ASSERT(2579, 0 <= poly_index && poly_index < pm_bgd->m_t_num); + + cXyz normal; + normal = pm_tri[poly_index].m_plane.mNormal; + + cBgD_Tri_t* t_tbl = pm_bgd->m_t_tbl; + cBgD_Vtx_t* v0 = &pm_vtx_tbl[t_tbl[poly_index].m_vtx_idx0]; + cBgD_Vtx_t* v1 = &pm_vtx_tbl[t_tbl[poly_index].m_vtx_idx1]; + cBgD_Vtx_t* v2 = &pm_vtx_tbl[t_tbl[poly_index].m_vtx_idx2]; + + cXyz points[3]; + points[0].set(*v0); + points[1].set(*v1); + points[2].set(*v2); + + points[0] += normal; + points[1] += normal; + points[2] += normal; + + dDbVw_drawTriangleXlu(points, color, TRUE); +} +#endif + dBgW::dBgW() { m_crr_func = NULL; m_ride_callback = NULL; @@ -976,41 +1222,44 @@ void dBgW::Move() { cBgW::Move(); } -void dBgW::positionWallCorrect(dBgS_Acch* i_acch, f32 i_dist, cM3dGPla& plane, cXyz* pupper_pos, +void dBgW::positionWallCorrect(dBgS_Acch* pwi, f32 dist, cM3dGPla& plane, cXyz* pupper_pos, f32 speed) { - i_acch->SetWallHit(); + pwi->SetWallHit(); - f32 speed_correct = speed - 1.0f; - if (speed_correct < 0.0f) { - speed_correct = 0.0f; + speed -= 1.0f; + if (speed < 0.0f) { + speed = 0.0f; } - f32 move = speed_correct * i_dist; - pupper_pos->x += move * plane.mNormal.x; - pupper_pos->z += move * plane.mNormal.z; + f32 move = speed * dist; + pupper_pos->x += move * plane.GetNP()->x; + pupper_pos->z += move * plane.GetNP()->z; + + JUT_ASSERT(2682, !isnan(pupper_pos->x)); + JUT_ASSERT(2683, !isnan(pupper_pos->z)); } -bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 i_poly_idx) { +bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 poly_index) { bool correct = false; while (true) { - cBgW_RwgElm* rwg_elm = &pm_rwg[i_poly_idx]; + cBgW_RwgElm* rwg_elm = &pm_rwg[poly_index]; - if (!ChkPolyThrough(i_poly_idx, pwi->GetPolyPassChk())) { - cBgW_TriElm* tri = &pm_tri[i_poly_idx]; + if (!ChkPolyThrough(poly_index, pwi->GetPolyPassChk())) { + cBgW_TriElm* tri = &pm_tri[poly_index]; f32 sp68 = JMAFastSqrt(tri->m_plane.GetNP()->x * tri->m_plane.GetNP()->x + tri->m_plane.GetNP()->z * tri->m_plane.GetNP()->z); if (cM3d_IsZero(sp68)) { if (rwg_elm->m_next != 0xFFFF) { - i_poly_idx = rwg_elm->m_next; + poly_index = rwg_elm->m_next; continue; } break; } f32 sp6C = 1.0f / sp68; - cBgD_Tri_t* tri_data = &pm_bgd->m_t_tbl[i_poly_idx]; + cBgD_Tri_t* tri_data = &pm_bgd->m_t_tbl[poly_index]; int cir_index = 0; while (cir_index < pwi->GetTblSize()) { @@ -1119,10 +1368,10 @@ bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 i_poly_idx) { JMAFastSqrt(spC8)); pwi->CalcMovePosWork(); pwi->SetWallCirHit(cir_index); - pwi->SetWallPolyIndex(cir_index, i_poly_idx); - pwi->SetWallAngleY(cir_index, - cM_atan2s(tri->m_plane.GetNP()->x, - tri->m_plane.GetNP()->z)); + pwi->SetWallPolyIndex(cir_index, poly_index); + + s16 sp10 = cM_atan2s(tri->m_plane.GetNP()->x, tri->m_plane.GetNP()->z); + pwi->SetWallAngleY(cir_index, sp10); correct = true; } else { cx0 -= sp50.x; @@ -1130,9 +1379,9 @@ bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 i_poly_idx) { cx1 -= sp50.x; cy1 -= sp50.z; - JUT_ASSERT(0, pwi->GetPos()->x == + JUT_ASSERT(2920, pwi->GetPos()->x == pwi->GetWallCirP(cir_index)->GetCx()); - JUT_ASSERT(0, pwi->GetPos()->z == + JUT_ASSERT(2922, pwi->GetPos()->z == pwi->GetWallCirP(cir_index)->GetCy()); f32 spE0 = @@ -1143,12 +1392,12 @@ bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 i_poly_idx) { f32 onx = -tri->m_plane.GetNP()->x; f32 ony = -tri->m_plane.GetNP()->z; - JUT_ASSERT(0, !(cM3d_IsZero(onx) && cM3d_IsZero(ony))); + JUT_ASSERT(2938, !(cM3d_IsZero(onx) && cM3d_IsZero(ony))); if (spE0 < spE4) { if (!(spE0 > spDC) && !(fabsf(spE0 - spDC) < 0.008f)) { - JUT_ASSERT(0, !isnan(cx0)); - JUT_ASSERT(0, !isnan(cy0)); + JUT_ASSERT(2950, !isnan(cx0)); + JUT_ASSERT(2951, !isnan(cy0)); f32 spF0, spF4; cM2d_CrossCirLin(*pwi->GetWallCirP(cir_index), cx0, cy0, @@ -1156,21 +1405,20 @@ bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 i_poly_idx) { pwi->GetPos()->x += cx0 - spF0; pwi->GetPos()->z += cy0 - spF4; - JUT_ASSERT(0, !isnan(pwi->GetPos()->x)); - JUT_ASSERT(0, !isnan(pwi->GetPos()->z)); + JUT_ASSERT(2968, !isnan(pwi->GetPos()->x)); + JUT_ASSERT(2969, !isnan(pwi->GetPos()->z)); pwi->CalcMovePosWork(); pwi->SetWallCirHit(cir_index); - pwi->SetWallPolyIndex(cir_index, i_poly_idx); - pwi->SetWallAngleY(cir_index, - cM_atan2s(tri->m_plane.GetNP()->x, - tri->m_plane.GetNP()->z)); + pwi->SetWallPolyIndex(cir_index, poly_index); + s16 spE = cM_atan2s(tri->m_plane.GetNP()->x, tri->m_plane.GetNP()->z); + pwi->SetWallAngleY(cir_index, spE); correct = true; pwi->SetWallHit(); } } else if (!(spE4 > spDC) && !(fabsf(spE4 - spDC) < 0.008f)) { - JUT_ASSERT(0, !isnan(cx1)); - JUT_ASSERT(0, !isnan(cy1)); + JUT_ASSERT(2999, !isnan(cx1)); + JUT_ASSERT(3000, !isnan(cy1)); f32 spF8, spFC; cM2d_CrossCirLin(*pwi->GetWallCirP(cir_index), cx1, cy1, @@ -1178,15 +1426,15 @@ bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 i_poly_idx) { pwi->GetPos()->x += cx1 - spF8; pwi->GetPos()->z += cy1 - spFC; - JUT_ASSERT(0, !isnan(pwi->GetPos()->x)); - JUT_ASSERT(0, !isnan(pwi->GetPos()->z)); + JUT_ASSERT(3016, !isnan(pwi->GetPos()->x)); + JUT_ASSERT(3017, !isnan(pwi->GetPos()->z)); pwi->CalcMovePosWork(); pwi->SetWallCirHit(cir_index); - pwi->SetWallPolyIndex(cir_index, i_poly_idx); - pwi->SetWallAngleY(cir_index, - cM_atan2s(tri->m_plane.GetNP()->x, - tri->m_plane.GetNP()->z)); + pwi->SetWallPolyIndex(cir_index, poly_index); + + s16 spC = cM_atan2s(tri->m_plane.GetNP()->x, tri->m_plane.GetNP()->z); + pwi->SetWallAngleY(cir_index, spC); correct = true; pwi->SetWallHit(); } @@ -1204,27 +1452,34 @@ bool dBgW::RwgWallCorrect(dBgS_Acch* pwi, u16 i_poly_idx) { break; } - i_poly_idx = rwg_elm->m_next; + poly_index = rwg_elm->m_next; } return correct; } -bool dBgW::WallCorrectRp(dBgS_Acch* i_acch, int i_idx) { - if (!pm_node_tree[i_idx].Cross(i_acch->GetWallBmdCylP())) { +bool dBgW::WallCorrectRp(dBgS_Acch* pwi, int node_index) { + JUT_ASSERT(3060, 0 <= node_index && node_index < pm_bgd->m_tree_num); + + cBgW_NodeTree* tree = &pm_node_tree[node_index]; + if (!tree->Cross(pwi->GetWallBmdCylP())) { return false; } - cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[i_idx]; + cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[node_index]; bool chk = false; - if ((tree->m_flag & 1)) { - if (pm_blk[tree->m_id[0]].m_wall_idx != 0xFFFF && - RwgWallCorrect(i_acch, pm_blk[tree->m_id[0]].m_wall_idx)) + if ((pnode->m_flag & 1)) { + JUT_ASSERT(3076, pnode->m_id[0] != 0xffff); + + JUT_ASSERT(3078, pnode->m_id[0] >= 0 && pnode->m_id[0] < pm_bgd->m_b_num); + + if (pm_blk[pnode->m_id[0]].m_wall_idx != 0xFFFF && + RwgWallCorrect(pwi, pm_blk[pnode->m_id[0]].m_wall_idx)) { chk = true; } - if (pm_blk[tree->m_id[0]].m_roof_idx != 0xFFFF && - RwgWallCorrect(i_acch, pm_blk[tree->m_id[0]].m_roof_idx)) + if (pm_blk[pnode->m_id[0]].m_roof_idx != 0xFFFF && + RwgWallCorrect(pwi, pm_blk[pnode->m_id[0]].m_roof_idx)) { chk = true; } @@ -1232,7 +1487,7 @@ bool dBgW::WallCorrectRp(dBgS_Acch* i_acch, int i_idx) { } for (int i = 0; i < 8; i++) { - if (tree->m_id[i] != 0xFFFF && WallCorrectRp(i_acch, tree->m_id[i])) { + if (pnode->m_id[i] != 0xFFFF && WallCorrectRp(pwi, pnode->m_id[i])) { chk = true; } } @@ -1240,28 +1495,31 @@ bool dBgW::WallCorrectRp(dBgS_Acch* i_acch, int i_idx) { return chk; } -bool dBgW::WallCorrectGrpRp(dBgS_Acch* i_acch, int i_idx, int i_depth) { - if (!pm_grp[i_idx].m_aab.Cross(i_acch->GetWallBmdCylP())) { +bool dBgW::WallCorrectGrpRp(dBgS_Acch* pwi, int g, int depth) { + JUT_ASSERT(3117, 0 <= g && g < pm_bgd->m_g_num); + + if (!pm_grp[g].m_aab.Cross(pwi->GetWallBmdCylP())) { return false; } - if (ChkGrpThrough(i_idx, i_acch->GetGrpPassChk(), i_depth)) { + if (ChkGrpThrough(g, pwi->GetGrpPassChk(), depth)) { return false; } bool chk = false; - if (pm_bgd->m_g_tbl[i_idx].m_tree_idx != 0xFFFF && - WallCorrectRp(i_acch, pm_bgd->m_g_tbl[i_idx].m_tree_idx)) + if (pm_bgd->m_g_tbl[g].m_tree_idx != 0xFFFF && + WallCorrectRp(pwi, pm_bgd->m_g_tbl[g].m_tree_idx)) { chk = true; } - int child_idx = pm_bgd->m_g_tbl[i_idx].m_first_child; + int child_idx = pm_bgd->m_g_tbl[g].m_first_child; + depth++; while (true) { if (child_idx == 0xFFFF) { break; } - if (WallCorrectGrpRp(i_acch, child_idx, i_depth + 1)) { + if (WallCorrectGrpRp(pwi, child_idx, depth)) { chk = true; } child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; @@ -1270,8 +1528,8 @@ bool dBgW::WallCorrectGrpRp(dBgS_Acch* i_acch, int i_idx, int i_depth) { return chk; } -bool dBgW::WallCorrect(dBgS_Acch* pacch) { - return WallCorrectGrpRp(pacch, m_rootGrpIdx, 1); +bool dBgW::WallCorrect(dBgS_Acch* pwi) { + return WallCorrectGrpRp(pwi, m_rootGrpIdx, 1); } struct wcs_data { @@ -1286,24 +1544,24 @@ static wcs_data* l_start; static int l_wcsbuf_num; -void dBgW::RwgWallCorrectSort(dBgS_Acch* i_acch, u16 i_poly_idx) { +void dBgW::RwgWallCorrectSort(dBgS_Acch* pwi, u16 poly_index) { while (true) { - cBgW_RwgElm* rwg_elm = &pm_rwg[i_poly_idx]; + cBgW_RwgElm* rwg_elm = &pm_rwg[poly_index]; - if (!ChkPolyThrough(i_poly_idx, i_acch->GetPolyPassChk())) { - cBgW_TriElm* tri_elm = &pm_tri[i_poly_idx]; + if (!ChkPolyThrough(poly_index, pwi->GetPolyPassChk())) { + cBgW_TriElm* tri_elm = &pm_tri[poly_index]; f32 var_f30 = JMAFastSqrt(tri_elm->m_plane.GetNP()->x * tri_elm->m_plane.GetNP()->x + tri_elm->m_plane.GetNP()->z * tri_elm->m_plane.GetNP()->z); if (cM3d_IsZero(var_f30)) { if (rwg_elm->m_next != 0xFFFF) { - i_poly_idx = rwg_elm->m_next; + poly_index = rwg_elm->m_next; continue; } break; } - fopAc_ac_c* actor = i_acch->getMyAc(); + fopAc_ac_c* actor = pwi->getMyAc(); cXyz sp88; sp88.x = cM_ssin(actor->current.angle.y); sp88.z = cM_scos(actor->current.angle.y); @@ -1312,52 +1570,67 @@ void dBgW::RwgWallCorrectSort(dBgS_Acch* i_acch, u16 i_poly_idx) { f32 var_f31 = var_f29 * ((sp88.x * tri_elm->m_plane.GetNP()->x) + (sp88.z * tri_elm->m_plane.GetNP()->z)); - wcs_data* data = l_start; - if (data == NULL) { + if (l_start == NULL) { if (l_wcsbuf_num < 84) { l_wcsbuf[l_wcsbuf_num].field_0x0 = var_f31; - l_wcsbuf[l_wcsbuf_num].poly_idx = i_poly_idx; + l_wcsbuf[l_wcsbuf_num].poly_idx = poly_index; l_wcsbuf[l_wcsbuf_num].next = NULL; l_start = &l_wcsbuf[l_wcsbuf_num]; l_wcsbuf_num++; + } else { + #if DEBUG + lbl_8074C7F0 = 1; + #endif } - } else if (i_poly_idx != l_start->poly_idx) { + } else if (poly_index != l_start->poly_idx) { if (var_f31 > l_start->field_0x0) { if (l_wcsbuf_num < 84) { l_wcsbuf[l_wcsbuf_num].field_0x0 = var_f31; - l_wcsbuf[l_wcsbuf_num].poly_idx = i_poly_idx; + l_wcsbuf[l_wcsbuf_num].poly_idx = poly_index; l_wcsbuf[l_wcsbuf_num].next = l_start; l_start = &l_wcsbuf[l_wcsbuf_num]; l_wcsbuf_num++; + } else { + #if DEBUG + lbl_8074C7F0 = 1; + #endif } } else { + wcs_data* data = l_start; while (true) { - wcs_data* tmp_data = data->next; - if (tmp_data == NULL) { + if (data->next == NULL) { if (l_wcsbuf_num < 84) { l_wcsbuf[l_wcsbuf_num].field_0x0 = var_f31; - l_wcsbuf[l_wcsbuf_num].poly_idx = i_poly_idx; + l_wcsbuf[l_wcsbuf_num].poly_idx = poly_index; l_wcsbuf[l_wcsbuf_num].next = NULL; data->next = &l_wcsbuf[l_wcsbuf_num]; l_wcsbuf_num++; + } else { + #if DEBUG + lbl_8074C7F0 = 1; + #endif } break; - } else if (i_poly_idx == tmp_data->poly_idx) { + } else if (poly_index == data->next->poly_idx) { break; } - if (var_f31 > tmp_data->field_0x0) { + if (var_f31 > data->next->field_0x0) { if (l_wcsbuf_num < 84) { l_wcsbuf[l_wcsbuf_num].field_0x0 = var_f31; - l_wcsbuf[l_wcsbuf_num].poly_idx = i_poly_idx; + l_wcsbuf[l_wcsbuf_num].poly_idx = poly_index; l_wcsbuf[l_wcsbuf_num].next = data->next; data->next = &l_wcsbuf[l_wcsbuf_num]; l_wcsbuf_num++; + } else { + #if DEBUG + lbl_8074C7F0 = 1; + #endif } break; } - data = tmp_data; + data = data->next; } } } @@ -1367,52 +1640,64 @@ void dBgW::RwgWallCorrectSort(dBgS_Acch* i_acch, u16 i_poly_idx) { return; } - i_poly_idx = rwg_elm->m_next; + poly_index = rwg_elm->m_next; } } -void dBgW::WallCorrectRpSort(dBgS_Acch* i_acch, int i_idx) { - if (!pm_node_tree[i_idx].Cross(i_acch->GetWallBmdCylP())) { +void dBgW::WallCorrectRpSort(dBgS_Acch* pwi, int node_index) { + JUT_ASSERT(3330, 0 <= node_index && node_index < pm_bgd->m_tree_num); + + cBgW_NodeTree* tree = &pm_node_tree[node_index]; + if (!tree->Cross(pwi->GetWallBmdCylP())) { return; } - cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[i_idx]; - if ((tree->m_flag & 1)) { - if (pm_blk[tree->m_id[0]].m_wall_idx != 0xFFFF) { - RwgWallCorrectSort(i_acch, pm_blk[tree->m_id[0]].m_wall_idx); + cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[node_index]; + if ((pnode->m_flag & 1)) { + JUT_ASSERT(3345, pnode->m_id[0] != 0xffff); + + JUT_ASSERT(3347, pnode->m_id[0] >= 0 && pnode->m_id[0] < pm_bgd->m_b_num); + + if (pm_blk[pnode->m_id[0]].m_wall_idx != 0xFFFF) { + RwgWallCorrectSort(pwi, pm_blk[pnode->m_id[0]].m_wall_idx); } - if (pm_blk[tree->m_id[0]].m_roof_idx != 0xFFFF) { - RwgWallCorrectSort(i_acch, pm_blk[tree->m_id[0]].m_roof_idx); + if (pm_blk[pnode->m_id[0]].m_roof_idx != 0xFFFF) { + RwgWallCorrectSort(pwi, pm_blk[pnode->m_id[0]].m_roof_idx); } return; } for (int i = 0; i < 8; i++) { - if (tree->m_id[i] != 0xFFFF) { - WallCorrectRpSort(i_acch, tree->m_id[i]); + if (pnode->m_id[i] != 0xFFFF) { + WallCorrectRpSort(pwi, pnode->m_id[i]); } } } -bool dBgW::WallCorrectGrpRpSort(dBgS_Acch* i_acch, int i_idx, int i_depth) { - if (!pm_grp[i_idx].m_aab.Cross(i_acch->GetWallBmdCylP())) { +bool dBgW::WallCorrectGrpRpSort(dBgS_Acch* pwi, int g, int depth) { + JUT_ASSERT(3378, 0 <= g && g < pm_bgd->m_g_num); + + if (!pm_grp[g].m_aab.Cross(pwi->GetWallBmdCylP())) { return false; } - if (ChkGrpThrough(i_idx, i_acch->GetGrpPassChk(), i_depth)) { + if (ChkGrpThrough(g, pwi->GetGrpPassChk(), depth)) { return false; } - if (pm_bgd->m_g_tbl[i_idx].m_tree_idx != 0xFFFF) { - WallCorrectRpSort(i_acch, pm_bgd->m_g_tbl[i_idx].m_tree_idx); + bool var_r25 = false; + + if (pm_bgd->m_g_tbl[g].m_tree_idx != 0xFFFF) { + WallCorrectRpSort(pwi, pm_bgd->m_g_tbl[g].m_tree_idx); } - int child_idx = pm_bgd->m_g_tbl[i_idx].m_first_child; + int child_idx = pm_bgd->m_g_tbl[g].m_first_child; + depth++; while (true) { if (child_idx == 0xFFFF) { break; } - WallCorrectGrpRpSort(i_acch, child_idx, i_depth + 1); + WallCorrectGrpRpSort(pwi, child_idx, depth); child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; } @@ -1546,8 +1831,8 @@ bool dBgW::WallCorrectSort(dBgS_Acch* pwi) { pwi->CalcMovePosWork(); pwi->SetWallCirHit(cir_index); pwi->SetWallPolyIndex(cir_index, poly_index); - pwi->SetWallAngleY(cir_index, cM_atan2s(tri->m_plane.GetNP()->x, - tri->m_plane.GetNP()->z)); + s16 sp10 = cM_atan2s(tri->m_plane.GetNP()->x, tri->m_plane.GetNP()->z); + pwi->SetWallAngleY(cir_index, sp10); correct = true; } else { cx0 -= sp50.x; @@ -1555,9 +1840,9 @@ bool dBgW::WallCorrectSort(dBgS_Acch* pwi) { cx1 -= sp50.x; cy1 -= sp50.z; - JUT_ASSERT(0, pwi->GetPos()->x == + JUT_ASSERT(3625, pwi->GetPos()->x == pwi->GetWallCirP(cir_index)->GetCx()); - JUT_ASSERT(0, pwi->GetPos()->z == + JUT_ASSERT(3627, pwi->GetPos()->z == pwi->GetWallCirP(cir_index)->GetCy()); f32 spE0 = @@ -1568,12 +1853,12 @@ bool dBgW::WallCorrectSort(dBgS_Acch* pwi) { f32 onx = -tri->m_plane.GetNP()->x; f32 ony = -tri->m_plane.GetNP()->z; - JUT_ASSERT(0, !(cM3d_IsZero(onx) && cM3d_IsZero(ony))); + JUT_ASSERT(3643, !(cM3d_IsZero(onx) && cM3d_IsZero(ony))); if (spE0 < spE4) { if (!(spE0 > spDC) && !(fabsf(spE0 - spDC) < 0.008f)) { - JUT_ASSERT(0, !isnan(cx0)); - JUT_ASSERT(0, !isnan(cy0)); + JUT_ASSERT(3655, !isnan(cx0)); + JUT_ASSERT(3656, !isnan(cy0)); f32 spF0, spF4; cM2d_CrossCirLin(*pwi->GetWallCirP(cir_index), cx0, cy0, @@ -1581,21 +1866,20 @@ bool dBgW::WallCorrectSort(dBgS_Acch* pwi) { pwi->GetPos()->x += cx0 - spF0; pwi->GetPos()->z += cy0 - spF4; - JUT_ASSERT(0, !isnan(pwi->GetPos()->x)); - JUT_ASSERT(0, !isnan(pwi->GetPos()->z)); + JUT_ASSERT(3666, !isnan(pwi->GetPos()->x)); + JUT_ASSERT(3667, !isnan(pwi->GetPos()->z)); pwi->CalcMovePosWork(); pwi->SetWallCirHit(cir_index); pwi->SetWallPolyIndex(cir_index, poly_index); - pwi->SetWallAngleY(cir_index, - cM_atan2s(tri->m_plane.GetNP()->x, - tri->m_plane.GetNP()->z)); + s16 spE = cM_atan2s(tri->m_plane.GetNP()->x, tri->m_plane.GetNP()->z); + pwi->SetWallAngleY(cir_index, spE); correct = true; pwi->SetWallHit(); } } else if (!(spE4 > spDC) && !(fabsf(spE4 - spDC) < 0.008f)) { - JUT_ASSERT(0, !isnan(cx1)); - JUT_ASSERT(0, !isnan(cy1)); + JUT_ASSERT(3697, !isnan(cx1)); + JUT_ASSERT(3698, !isnan(cy1)); f32 spF8, spFC; cM2d_CrossCirLin(*pwi->GetWallCirP(cir_index), cx1, cy1, onx, @@ -1603,15 +1887,14 @@ bool dBgW::WallCorrectSort(dBgS_Acch* pwi) { pwi->GetPos()->x += cx1 - spF8; pwi->GetPos()->z += cy1 - spFC; - JUT_ASSERT(0, !isnan(pwi->GetPos()->x)); - JUT_ASSERT(0, !isnan(pwi->GetPos()->z)); + JUT_ASSERT(3707, !isnan(pwi->GetPos()->x)); + JUT_ASSERT(3708, !isnan(pwi->GetPos()->z)); pwi->CalcMovePosWork(); pwi->SetWallCirHit(cir_index); pwi->SetWallPolyIndex(cir_index, poly_index); - pwi->SetWallAngleY(cir_index, - cM_atan2s(tri->m_plane.GetNP()->x, - tri->m_plane.GetNP()->z)); + s16 spC = cM_atan2s(tri->m_plane.GetNP()->x, tri->m_plane.GetNP()->z); + pwi->SetWallAngleY(cir_index, spC); correct = true; pwi->SetWallHit(); } @@ -1630,46 +1913,58 @@ bool dBgW::WallCorrectSort(dBgS_Acch* pwi) { return correct; } -bool dBgW::RwgRoofChk(u16 i_poly_idx, dBgS_RoofChk* i_roofchk) { +bool dBgW::RwgRoofChk(u16 poly_index, dBgS_RoofChk* proofchk) { bool chk = false; - f32 crossY; + f32 cy; while (true) { - if (pm_tri[i_poly_idx].m_plane.getCrossY(*i_roofchk->GetPosP(), &crossY) && - crossY > i_roofchk->GetPosP()->y && crossY < i_roofchk->GetNowY()) + if (pm_tri[poly_index].m_plane.getCrossY(*proofchk->GetPosP(), &cy) && + cy > proofchk->GetPosP()->y && cy < proofchk->GetNowY()) { - cBgD_Tri_t* tri = &pm_bgd->m_t_tbl[i_poly_idx]; + cBgD_Tri_t* tri = &pm_bgd->m_t_tbl[poly_index]; if (cM3d_CrossY_Tri(pm_vtx_tbl[tri->m_vtx_idx0], pm_vtx_tbl[tri->m_vtx_idx1], - pm_vtx_tbl[tri->m_vtx_idx2], pm_tri[i_poly_idx].m_plane, - (const Vec*)i_roofchk->GetPosP())) + pm_vtx_tbl[tri->m_vtx_idx2], pm_tri[poly_index].m_plane, + (const Vec*)proofchk->GetPosP())) { - if (!ChkPolyThrough(i_poly_idx, i_roofchk->GetPolyPassChk())) { - i_roofchk->SetNowY(crossY); - i_roofchk->SetPolyIndex(i_poly_idx); + if (!ChkPolyThrough(poly_index, proofchk->GetPolyPassChk())) { + proofchk->SetNowY(cy); + proofchk->SetPolyIndex(poly_index); chk = true; + + JUT_ASSERT(3774, !isnan(cy)); + + JUT_ASSERT(3776, -INF < cy && cy < INF); } } } - if (pm_rwg[i_poly_idx].m_next == 0xFFFF) + cBgW_RwgElm* element = &pm_rwg[poly_index]; + if (element->m_next == 0xFFFF) break; - i_poly_idx = pm_rwg[i_poly_idx].m_next; + + poly_index = element->m_next; } return chk; } -bool dBgW::RoofChkRp(dBgS_RoofChk* i_roofchk, int i_idx) { - cBgW_NodeTree* node = &pm_node_tree[i_idx]; - if (!node->CrossY(i_roofchk->GetPosP()) || !node->UnderPlaneYUnder(i_roofchk->GetNowY()) || - node->TopPlaneYUnder(i_roofchk->GetPosP()->y)) +bool dBgW::RoofChkRp(dBgS_RoofChk* proofchk, int node_index) { + JUT_ASSERT(3802, 0 <= node_index && node_index < pm_bgd->m_tree_num); + + cBgW_NodeTree* node = &pm_node_tree[node_index]; + if (!node->CrossY(proofchk->GetPosP()) || !node->UnderPlaneYUnder(proofchk->GetNowY()) || + node->TopPlaneYUnder(proofchk->GetPosP()->y)) { return false; } - cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[i_idx]; - if ((tree->m_flag & 1)) { - if (pm_blk[tree->m_id[0]].m_roof_idx != 0xFFFF && - RwgRoofChk(pm_blk[tree->m_id[0]].m_roof_idx, i_roofchk)) + cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[node_index]; + if ((pnode->m_flag & 1)) { + JUT_ASSERT(3819, pnode->m_id[0] != 0xffff); + + JUT_ASSERT(3821, pnode->m_id[0] >= 0 && pnode->m_id[0] < pm_bgd->m_b_num); + + if (pm_blk[pnode->m_id[0]].m_roof_idx != 0xFFFF && + RwgRoofChk(pm_blk[pnode->m_id[0]].m_roof_idx, proofchk)) { return true; } @@ -1678,7 +1973,7 @@ bool dBgW::RoofChkRp(dBgS_RoofChk* i_roofchk, int i_idx) { bool chk = false; for (int i = 0; i < 8; i++) { - if (tree->m_id[i] != 0xFFFF && RoofChkRp(i_roofchk, tree->m_id[i])) { + if (pnode->m_id[i] != 0xFFFF && RoofChkRp(proofchk, pnode->m_id[i])) { chk = true; } } @@ -1686,31 +1981,34 @@ bool dBgW::RoofChkRp(dBgS_RoofChk* i_roofchk, int i_idx) { return chk; } -bool dBgW::RoofChkGrpRp(dBgS_RoofChk* i_roofchk, int i_idx, int i_depth) { - cBgW_GrpElm* grp = &pm_grp[i_idx]; - if (!grp->m_aab.CrossY(i_roofchk->GetPosP()) || - !grp->m_aab.UnderPlaneYUnder(i_roofchk->GetNowY()) || - grp->m_aab.TopPlaneYUnder(i_roofchk->GetPosP()->y)) +bool dBgW::RoofChkGrpRp(dBgS_RoofChk* proofchk, int g, int depth) { + JUT_ASSERT(3856, 0 <= g && g < pm_bgd->m_g_num); + + cBgW_GrpElm* grp = &pm_grp[g]; + if (!grp->m_aab.CrossY(proofchk->GetPosP()) || + !grp->m_aab.UnderPlaneYUnder(proofchk->GetNowY()) || + grp->m_aab.TopPlaneYUnder(proofchk->GetPosP()->y)) { return false; } - if (ChkGrpThrough(i_idx, i_roofchk->GetGrpPassChk(), i_depth)) { + if (ChkGrpThrough(g, proofchk->GetGrpPassChk(), depth)) { return false; } bool chk = false; - cBgD_Grp_t* data = &pm_bgd->m_g_tbl[i_idx]; - if (data->m_tree_idx != 0xFFFF && RoofChkRp(i_roofchk, data->m_tree_idx)) { + cBgD_Grp_t* data = &pm_bgd->m_g_tbl[g]; + if (data->m_tree_idx != 0xFFFF && RoofChkRp(proofchk, data->m_tree_idx)) { chk = true; } + depth++; int child_idx = data->m_first_child; while (true) { if (child_idx == 0xFFFF) { break; } - if (RoofChkGrpRp(i_roofchk, child_idx, i_depth + 1)) { + if (RoofChkGrpRp(proofchk, child_idx, depth)) { chk = true; } child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; @@ -1719,50 +2017,62 @@ bool dBgW::RoofChkGrpRp(dBgS_RoofChk* i_roofchk, int i_idx, int i_depth) { return chk; } -bool dBgW::RoofChk(dBgS_RoofChk* pchk) { - return RoofChkGrpRp(pchk, m_rootGrpIdx, 1); +bool dBgW::RoofChk(dBgS_RoofChk* proofchk) { + return RoofChkGrpRp(proofchk, m_rootGrpIdx, 1); } -bool dBgW::RwgSplGrpChk(u16 i_poly_idx, dBgS_SplGrpChk* i_splchk) { +bool dBgW::RwgSplGrpChk(u16 poly_index, dBgS_SplGrpChk* psplchk) { bool chk = false; - f32 crossY; + f32 cy; while (true) { - if (pm_tri[i_poly_idx].m_plane.getCrossY(i_splchk->GetPosP(), &crossY) && - crossY < i_splchk->GetRoof() && crossY > i_splchk->GetHeight()) + if (pm_tri[poly_index].m_plane.getCrossY(psplchk->GetPosP(), &cy) && + cy < psplchk->GetRoof() && cy > psplchk->GetHeight()) { - cBgD_Tri_t* tri = &pm_bgd->m_t_tbl[i_poly_idx]; + cBgD_Tri_t* tri = &pm_bgd->m_t_tbl[poly_index]; if (cM3d_CrossY_Tri(pm_vtx_tbl[tri->m_vtx_idx0], pm_vtx_tbl[tri->m_vtx_idx1], - pm_vtx_tbl[tri->m_vtx_idx2], pm_tri[i_poly_idx].m_plane, - (const Vec*)&i_splchk->GetPosP())) + pm_vtx_tbl[tri->m_vtx_idx2], pm_tri[poly_index].m_plane, + (const Vec*)&psplchk->GetPosP())) { - if (!ChkPolyThrough(i_poly_idx, i_splchk->GetPolyPassChk())) { - i_splchk->SetHeight(crossY); - i_splchk->SetPolyIndex(i_poly_idx); + if (!ChkPolyThrough(poly_index, psplchk->GetPolyPassChk())) { + psplchk->SetHeight(cy); + psplchk->SetPolyIndex(poly_index); chk = true; + + JUT_ASSERT(3951, !isnan(cy)); + + JUT_ASSERT(3953, -INF < cy && cy < INF); } } } - if (pm_rwg[i_poly_idx].m_next == 0xFFFF) + cBgW_RwgElm* element = &pm_rwg[poly_index]; + if (element->m_next == 0xFFFF) break; - i_poly_idx = pm_rwg[i_poly_idx].m_next; + + poly_index = element->m_next; } return chk; } -bool dBgW::SplGrpChkRp(dBgS_SplGrpChk* i_splchk, int i_idx) { - cBgW_NodeTree* node = &pm_node_tree[i_idx]; - if (!node->CrossY(&i_splchk->GetPosP()) || !node->UnderPlaneYUnder(i_splchk->GetRoof()) || - node->TopPlaneYUnder(i_splchk->GetHeight())) +bool dBgW::SplGrpChkRp(dBgS_SplGrpChk* psplchk, int node_index) { + JUT_ASSERT(3980, 0 <= node_index && node_index < pm_bgd->m_tree_num); + + cBgW_NodeTree* node = &pm_node_tree[node_index]; + if (!node->CrossY(&psplchk->GetPosP()) || !node->UnderPlaneYUnder(psplchk->GetRoof()) || + node->TopPlaneYUnder(psplchk->GetHeight())) { return false; } - cBgD_Tree_t* tree = &pm_bgd->m_tree_tbl[i_idx]; - if ((tree->m_flag & 1)) { - if (pm_blk[tree->m_id[0]].m_gnd_idx != 0xFFFF && - RwgSplGrpChk(pm_blk[tree->m_id[0]].m_gnd_idx, i_splchk)) + cBgD_Tree_t* pnode = &pm_bgd->m_tree_tbl[node_index]; + if ((pnode->m_flag & 1)) { + JUT_ASSERT(3996, pnode->m_id[0] != 0xffff); + + JUT_ASSERT(3998, pnode->m_id[0] >= 0 && pnode->m_id[0] < pm_bgd->m_b_num); + + if (pm_blk[pnode->m_id[0]].m_gnd_idx != 0xFFFF && + RwgSplGrpChk(pm_blk[pnode->m_id[0]].m_gnd_idx, psplchk)) { return true; } @@ -1771,7 +2081,7 @@ bool dBgW::SplGrpChkRp(dBgS_SplGrpChk* i_splchk, int i_idx) { bool chk = false; for (int i = 0; i < 8; i++) { - if (tree->m_id[i] != 0xFFFF && SplGrpChkRp(i_splchk, tree->m_id[i])) { + if (pnode->m_id[i] != 0xFFFF && SplGrpChkRp(psplchk, pnode->m_id[i])) { chk = true; } } @@ -1779,31 +2089,34 @@ bool dBgW::SplGrpChkRp(dBgS_SplGrpChk* i_splchk, int i_idx) { return chk; } -bool dBgW::SplGrpChkGrpRp(dBgS_SplGrpChk* i_splchk, int i_idx, int i_depth) { - cBgW_GrpElm* grp = &pm_grp[i_idx]; - if (!grp->m_aab.CrossY(&i_splchk->GetPosP()) || - !grp->m_aab.UnderPlaneYUnder(i_splchk->GetRoof()) || - grp->m_aab.TopPlaneYUnder(i_splchk->GetHeight())) +bool dBgW::SplGrpChkGrpRp(dBgS_SplGrpChk* psplchk, int g, int depth) { + JUT_ASSERT(4030, 0 <= g && g < pm_bgd->m_g_num); + + cBgW_GrpElm* grp = &pm_grp[g]; + if (!grp->m_aab.CrossY(&psplchk->GetPosP()) || + !grp->m_aab.UnderPlaneYUnder(psplchk->GetRoof()) || + grp->m_aab.TopPlaneYUnder(psplchk->GetHeight())) { return false; } - if (ChkGrpThrough(i_idx, i_splchk->GetGrpPassChk(), i_depth)) { + if (ChkGrpThrough(g, psplchk->GetGrpPassChk(), depth)) { return false; } bool chk = false; - cBgD_Grp_t* data = &pm_bgd->m_g_tbl[i_idx]; - if (data->m_tree_idx != 0xFFFF && SplGrpChkRp(i_splchk, data->m_tree_idx)) { + cBgD_Grp_t* data = &pm_bgd->m_g_tbl[g]; + if (data->m_tree_idx != 0xFFFF && SplGrpChkRp(psplchk, data->m_tree_idx)) { chk = true; } + depth++; int child_idx = data->m_first_child; while (true) { if (child_idx == 0xFFFF) { break; } - if (SplGrpChkGrpRp(i_splchk, child_idx, i_depth + 1)) { + if (SplGrpChkGrpRp(psplchk, child_idx, depth)) { chk = true; } child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; @@ -1812,38 +2125,41 @@ bool dBgW::SplGrpChkGrpRp(dBgS_SplGrpChk* i_splchk, int i_idx, int i_depth) { return chk; } -bool dBgW::SplGrpChk(dBgS_SplGrpChk* pchk) { - return SplGrpChkGrpRp(pchk, m_rootGrpIdx, 1); +bool dBgW::SplGrpChk(dBgS_SplGrpChk* psplchk) { + return SplGrpChkGrpRp(psplchk, m_rootGrpIdx, 1); } -void dBgW::RwgCaptPoly(int i_idx, dBgS_CaptPoly& i_captpoly) { +void dBgW::RwgCaptPoly(int index, dBgS_CaptPoly& capt) { + cBgW_RwgElm* rwg; while (true) { - cBgW_RwgElm* rwg = &pm_rwg[i_idx]; - i_captpoly.m_callback(i_captpoly, pm_vtx_tbl, pm_bgd->m_t_tbl[i_idx].m_vtx_idx0, - pm_bgd->m_t_tbl[i_idx].m_vtx_idx1, pm_bgd->m_t_tbl[i_idx].m_vtx_idx2, - &pm_tri[i_idx].m_plane); + rwg = &pm_rwg[index]; + capt.m_callback(&capt, pm_vtx_tbl, pm_bgd->m_t_tbl[index].m_vtx_idx0, + pm_bgd->m_t_tbl[index].m_vtx_idx1, pm_bgd->m_t_tbl[index].m_vtx_idx2, + &pm_tri[index].m_plane); if (rwg->m_next == 0xFFFF) break; - i_idx = rwg->m_next; + index = rwg->m_next; + + JUT_ASSERT(4110, 0 <= index && index < pm_bgd->m_t_num); } } -void dBgW::CaptPolyRp(dBgS_CaptPoly& i_captpoly, int i_idx) { - if (!pm_node_tree[i_idx].Cross(i_captpoly.GetBndP())) { +void dBgW::CaptPolyRp(dBgS_CaptPoly& capt, int node_index) { + if (!pm_node_tree[node_index].Cross(capt.GetBndP())) { return; } - cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[i_idx]; + cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[node_index]; if (tree_data->m_flag & 1) { if (pm_blk[tree_data->m_id[0]].m_wall_idx != 0xFFFF) { - RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_wall_idx, i_captpoly); + RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_wall_idx, capt); } if (pm_blk[tree_data->m_id[0]].m_roof_idx != 0xFFFF) { - RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_roof_idx, i_captpoly); + RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_roof_idx, capt); } if (pm_blk[tree_data->m_id[0]].m_gnd_idx != 0xFFFF) { - RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_gnd_idx, i_captpoly); + RwgCaptPoly(pm_blk[tree_data->m_id[0]].m_gnd_idx, capt); } return; } @@ -1852,90 +2168,90 @@ void dBgW::CaptPolyRp(dBgS_CaptPoly& i_captpoly, int i_idx) { if (tree_data->m_id[i] == 0xFFFF) { continue; } - CaptPolyRp(i_captpoly, tree_data->m_id[i]); + CaptPolyRp(capt, tree_data->m_id[i]); } } -void dBgW::CaptPolyGrpRp(dBgS_CaptPoly& i_captpoly, int i_idx, int i_depth) { - cBgW_GrpElm* grp = &pm_grp[i_idx]; - if (!grp->m_aab.Cross(i_captpoly.GetBndP())) { +void dBgW::CaptPolyGrpRp(dBgS_CaptPoly& capt, int node_index, int depth) { + if (!pm_grp[node_index].m_aab.Cross(capt.GetBndP())) { return; } - if (ChkGrpThrough(i_idx, i_captpoly.GetGrpPassChk(), i_depth)) { + if (ChkGrpThrough(node_index, capt.GetGrpPassChk(), depth)) { return; } - cBgD_Grp_t* data = &pm_bgd->m_g_tbl[i_idx]; - if (pm_bgd->m_g_tbl[i_idx].m_tree_idx != 0xFFFF) { - CaptPolyRp(i_captpoly, pm_bgd->m_g_tbl[i_idx].m_tree_idx); + if (pm_bgd->m_g_tbl[node_index].m_tree_idx != 0xFFFF) { + CaptPolyRp(capt, pm_bgd->m_g_tbl[node_index].m_tree_idx); } - int child_idx = pm_bgd->m_g_tbl[i_idx].m_first_child; + depth++; + int child_idx = pm_bgd->m_g_tbl[node_index].m_first_child; while (true) { if (child_idx == 0xFFFF) { break; } - CaptPolyGrpRp(i_captpoly, child_idx, i_depth + 1); + CaptPolyGrpRp(capt, child_idx, depth); child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; } } -void dBgW::CaptPoly(dBgS_CaptPoly& i_captpoly) { - CaptPolyGrpRp(i_captpoly, m_rootGrpIdx, 1); +void dBgW::CaptPoly(dBgS_CaptPoly& capt) { + CaptPolyGrpRp(capt, m_rootGrpIdx, 1); } -bool dBgW::RwgSphChk(u16 i_poly_idx, dBgS_SphChk* i_sphchk, void* i_data) { +bool dBgW::RwgSphChk(u16 poly_index, dBgS_SphChk* psphchk, void* i_data) { cM3dGTri tri; cBgW_RwgElm* rwg; cBgD_Tri_t* tri_t; bool chk = false; while (true) { - rwg = &pm_rwg[i_poly_idx]; - if (!ChkPolyThrough(i_poly_idx, i_sphchk->GetPolyPassChk())) { - tri_t = &pm_bgd->m_t_tbl[i_poly_idx]; + rwg = &pm_rwg[poly_index]; + if (!ChkPolyThrough(poly_index, psphchk->GetPolyPassChk())) { + tri_t = &pm_bgd->m_t_tbl[poly_index]; tri.setBg(&pm_vtx_tbl[tri_t->m_vtx_idx0], &pm_vtx_tbl[tri_t->m_vtx_idx1], - &pm_vtx_tbl[tri_t->m_vtx_idx2], &pm_tri[i_poly_idx].m_plane); + &pm_vtx_tbl[tri_t->m_vtx_idx2], &pm_tri[poly_index].m_plane); - if (i_sphchk->cross(&tri)) { - i_sphchk->mCallback(i_sphchk, pm_vtx_tbl, tri_t->m_vtx_idx0, tri_t->m_vtx_idx1, - tri_t->m_vtx_idx2, &pm_tri[i_poly_idx].m_plane, i_data); - i_sphchk->SetPolyIndex(i_poly_idx); + if (psphchk->cross(&tri)) { + psphchk->mCallback(psphchk, pm_vtx_tbl, tri_t->m_vtx_idx0, tri_t->m_vtx_idx1, + tri_t->m_vtx_idx2, &pm_tri[poly_index].m_plane, i_data); + psphchk->SetPolyIndex(poly_index); chk = true; } } if (rwg->m_next == 0xFFFF) break; - i_poly_idx = rwg->m_next; + poly_index = rwg->m_next; } return chk; } -bool dBgW::SphChkRp(dBgS_SphChk* i_sphchk, void* i_data, int i_idx) { - if (!pm_node_tree[i_idx].Cross(i_sphchk)) { +bool dBgW::SphChkRp(dBgS_SphChk* psphchk, void* i_data, int node_index) { + cBgW_NodeTree* tree = &pm_node_tree[node_index]; + if (!tree->Cross(psphchk)) { return false; } - cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[i_idx]; + cBgD_Tree_t* tree_data = &pm_bgd->m_tree_tbl[node_index]; bool chk = false; if (tree_data->m_flag & 1) { if (pm_blk[tree_data->m_id[0]].m_gnd_idx != 0xFFFF && - RwgSphChk(pm_blk[tree_data->m_id[0]].m_gnd_idx, i_sphchk, i_data)) + RwgSphChk(pm_blk[tree_data->m_id[0]].m_gnd_idx, psphchk, i_data)) { chk = true; } if (pm_blk[tree_data->m_id[0]].m_roof_idx != 0xFFFF && - RwgSphChk(pm_blk[tree_data->m_id[0]].m_roof_idx, i_sphchk, i_data)) + RwgSphChk(pm_blk[tree_data->m_id[0]].m_roof_idx, psphchk, i_data)) { chk = true; } if (pm_blk[tree_data->m_id[0]].m_wall_idx != 0xFFFF && - RwgSphChk(pm_blk[tree_data->m_id[0]].m_wall_idx, i_sphchk, i_data)) + RwgSphChk(pm_blk[tree_data->m_id[0]].m_wall_idx, psphchk, i_data)) { chk = true; } @@ -1947,34 +2263,36 @@ bool dBgW::SphChkRp(dBgS_SphChk* i_sphchk, void* i_data, int i_idx) { if (tree_data->m_id[i] == 0xFFFF) { continue; } - if (SphChkRp(i_sphchk, i_data, tree_data->m_id[i])) { + if (SphChkRp(psphchk, i_data, tree_data->m_id[i])) { chk = true; } } return chk; } -bool dBgW::SphChkGrpRp(dBgS_SphChk* i_sphchk, void* i_data, int i_idx, int i_depth) { - if (!pm_grp[i_idx].m_aab.Cross(i_sphchk)) { +bool dBgW::SphChkGrpRp(dBgS_SphChk* psphchk, void* i_data, int node_index, int depth) { + cBgW_GrpElm* pnode = &pm_grp[node_index]; + if (!pnode->m_aab.Cross(psphchk)) { return false; } - if (ChkGrpThrough(i_idx, i_sphchk->GetGrpPassChk(), i_depth)) { + if (ChkGrpThrough(node_index, psphchk->GetGrpPassChk(), depth)) { return false; } bool chk = false; - cBgD_Grp_t* data = &pm_bgd->m_g_tbl[i_idx]; - if (data->m_tree_idx != 0xFFFF && SphChkRp(i_sphchk, i_data, data->m_tree_idx)) { + cBgD_Grp_t* data = &pm_bgd->m_g_tbl[node_index]; + if (data->m_tree_idx != 0xFFFF && SphChkRp(psphchk, i_data, data->m_tree_idx)) { chk = true; } + depth++; int child_idx = data->m_first_child; while (true) { if (child_idx == 0xFFFF) { break; } - if (SphChkGrpRp(i_sphchk, i_data, child_idx, i_depth + 1)) { + if (SphChkGrpRp(psphchk, i_data, child_idx, depth)) { chk = true; } child_idx = pm_bgd->m_g_tbl[child_idx].m_next_sibling; @@ -1983,35 +2301,39 @@ bool dBgW::SphChkGrpRp(dBgS_SphChk* i_sphchk, void* i_data, int i_idx, int i_dep return chk; } -bool dBgW::SphChk(dBgS_SphChk* pchk, void* i_data) { - return SphChkGrpRp(pchk, i_data, m_rootGrpIdx, 1); +bool dBgW::SphChk(dBgS_SphChk* psphchk, void* i_data) { + return SphChkGrpRp(psphchk, i_data, m_rootGrpIdx, 1); } -u8 dBgW::GetPolyGrpRoomInfId(cBgS_PolyInfo const& poly) { - return GetGrpInf(poly) & 0xFF; +u8 dBgW::GetPolyGrpRoomInfId(const cBgS_PolyInfo& polyinfo) { + u32 inf = GetGrpInf(polyinfo); + u8 id = inf & 0xFF; + return id; } -int dBgW::GetGrpSoundId(cBgS_PolyInfo const& poly) { - return (GetGrpInf(poly) >> 11) & 0xFF; +int dBgW::GetGrpSoundId(const cBgS_PolyInfo& polyinfo) { + u32 inf = GetGrpInf(polyinfo); + int id = (inf >> 11) & 0xFF; + return id; } -void dBgW::CrrPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos, - csXyz* i_angle, csXyz* i_shapeAngle) { +void dBgW::CrrPos(const cBgS_PolyInfo& polyinfo, void* actor_ptr, bool param_2, cXyz* ppos, + csXyz* pangle, csXyz* pshapeangle) { if (m_crr_func) { - m_crr_func(this, i_actor_ptr, i_poly, param_2, i_pos, i_angle, i_shapeAngle); + m_crr_func(this, actor_ptr, polyinfo, param_2, ppos, pangle, pshapeangle); } } -void dBgW::TransPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos, - csXyz* i_angle, csXyz* i_shapeAngle) { +void dBgW::TransPos(const cBgS_PolyInfo& polyinfo, void* actor_ptr, bool param_2, cXyz* ppos, + csXyz* pangle, csXyz* pshapeangle) { if (m_crr_func) { - m_crr_func(this, i_actor_ptr, i_poly, param_2, i_pos, i_angle, i_shapeAngle); + m_crr_func(this, actor_ptr, polyinfo, param_2, ppos, pangle, pshapeangle); } } -void dBgW::MatrixCrrPos(cBgS_PolyInfo const& i_poly, void* i_actor_ptr, bool param_2, cXyz* i_pos, - csXyz* i_angle, csXyz* i_shapeAngle) { - CrrPos(i_poly, i_actor_ptr, param_2, i_pos, i_angle, i_shapeAngle); +void dBgW::MatrixCrrPos(const cBgS_PolyInfo& polyinfo, void* actor_ptr, bool param_2, cXyz* ppos, + csXyz* pangle, csXyz* pshapeangle) { + CrrPos(polyinfo, actor_ptr, param_2, ppos, pangle, pshapeangle); } bool dBgW::ChkPolyThrough(int poly_index, cBgS_PolyPassChk* ppass_chk) { @@ -2066,7 +2388,8 @@ bool dBgW::ChkPolyThrough(int poly_index, cBgS_PolyPassChk* ppass_chk) { cXyz pos(pm_tri[poly_index].m_plane.mNormal); if (chk->ChkHorse() && dComIfGp_getHorseActor() != NULL) { - if (!dComIfGp_getHorseActor()->checkSpecialWallHit(pos)) { + daHorse_c* horse = dComIfGp_getHorseActor(); + if (!horse->checkSpecialWallHit(pos)) { return true; } } @@ -2083,26 +2406,35 @@ bool dBgW::ChkPolyThrough(int poly_index, cBgS_PolyPassChk* ppass_chk) { return false; } -bool dBgW::ChkShdwDrawThrough(int poly_index, cBgS_PolyPassChk*) { +bool dBgW::ChkShdwDrawThrough(int poly_index, cBgS_PolyPassChk* ppchk) { + UNUSED(ppchk); + if (GetShdwThrough(poly_index)) { return true; } - return GetPolyArrowThrough(poly_index); + if (GetPolyArrowThrough(poly_index)) { + return true; + } + + return false; } -bool dBgW::ChkGrpThrough(int i_grp_idx, cBgS_GrpPassChk* i_passChk, int i_depth) { - if (i_depth != 2 || i_passChk == NULL) { +bool dBgW::ChkGrpThrough(int g, cBgS_GrpPassChk* ppasschk, int depth) { + if (depth != 2 || ppasschk == NULL) { return false; } - if ((pm_bgd->m_g_tbl[i_grp_idx].m_info & 0x100) == 0 && - ((dBgS_GrpPassChk*)i_passChk)->MaskNormalGrp()) + + dBgS_GrpPassChk* var_r31 = (dBgS_GrpPassChk*)ppasschk; + + u32 var_r29 = pm_bgd->m_g_tbl[g].m_info & 0x100; + if (!var_r29 && var_r31->MaskNormalGrp()) { return false; } - if ((pm_bgd->m_g_tbl[i_grp_idx].m_info & 0x100) && - ((dBgS_GrpPassChk*)i_passChk)->MaskWaterGrp()) + u32 var_r28 = pm_bgd->m_g_tbl[g].m_info & 0x100; + if (var_r28 && var_r31->MaskWaterGrp()) { return false; } @@ -2123,7 +2455,7 @@ void dBgW::CallArrowStickCallBack(fopAc_ac_c* param_0, fopAc_ac_c* param_1, cXyz } void dBgW::OffMoveFlag() { - m_flags &= ~1; + m_flags &= (u8)~1; } u32 dBgW::ChkMoveFlag() const { @@ -2134,10 +2466,13 @@ dBgW* dBgW_NewSet(cBgD_t* pbgd, u32 flags, Mtx* pbase_mtx) { dBgW* nw = new dBgW(); if (nw == NULL) { + OS_REPORT_ERROR("dBgW_NewSet():dBgWの確保失敗\n"); return NULL; } - if (nw->Set(pbgd, flags, pbase_mtx)) { + bool rt = nw->Set(pbgd, flags, pbase_mtx); + if (rt) { + OS_REPORT_ERROR("dBgW_NewSet():dBgWのSet失敗\n"); return NULL; } diff --git a/src/d/d_bg_w_kcol.cpp b/src/d/d_bg_w_kcol.cpp index 07950e67634..aff8edb7a6c 100644 --- a/src/d/d_bg_w_kcol.cpp +++ b/src/d/d_bg_w_kcol.cpp @@ -3,7 +3,7 @@ #include "d/d_bg_w_kcol.h" #include "d/d_com_inf_game.h" #include "d/actor/d_a_horse.h" -#include "d/d_bg_s_cap_poly.h" +#include "d/d_bg_s_capt_poly.h" #include #include @@ -979,7 +979,7 @@ void dBgWKCol::CaptPoly(dBgS_CaptPoly& i_captpoly) { cM3dGPla plane; plane = GetTriPla(r28[0]); - i_captpoly.m_callback(i_captpoly, (cBgD_Vtx_t*)&vtx_tbl, 0, 1, 2, &plane); + i_captpoly.m_callback(&i_captpoly, (cBgD_Vtx_t*)&vtx_tbl, 0, 1, 2, &plane); } } } diff --git a/src/d/d_menu_window_HIO.cpp b/src/d/d_menu_window_HIO.cpp index c48e62d0a8e..053aeaf8378 100644 --- a/src/d/d_menu_window_HIO.cpp +++ b/src/d/d_menu_window_HIO.cpp @@ -7,6 +7,13 @@ #include "d/d_menu_window_HIO.h" #include "d/d_com_inf_game.h" +#include "d/d_msg_object.h" +#include "d/d_meter2_info.h" + +#if DEBUG +#include "JSystem/JHostIO/JORServer.h" +#include "d/d_s_menu.h" +#endif dMw_HIO_c::dMw_HIO_c() { init(); @@ -21,127 +28,1058 @@ void dMw_HIO_c::init() { mBombFlag = 0; mPachinkoFlag = 0; - mLifeCopy = 0; - mLife = 0; - mMaxLifeCopy = 0; - mMaxLife = 0; - mMagicCopy = 0; - mMagic = 0; - mMaxMagicCopy = 0; - mMaxMagic = 0; - mOilCopy = 0; - mOil = 0; - mMaxOilCopy = 0; - mMaxOil = 0; - mOxygenCopy = 0; - mOxygen = 0; - mMaxOxygenCopy = 0; - mMaxOxygen = 0; - mEnableMagicCopy = false; - mEnableMagic = false; - mEnableArrowDropsCopy = false; - mEnableArrowDrops = false; - mRupeesCopy = 0; - mRupees = 0; - mWalletSizeCopy = WALLET; - mWalletSize = WALLET; - mKeysCopy = 0; - mKeys = 0; - field_0x47 = 0; - field_0x23 = 0; - mEnableOxygenMeterCopy = false; - mEnableOxygenMeter = false; - mPoesCopy = 0; - mPoes = 0; - mDonationAmountCopy = 0; - mDonationAmount = 0; + mLife = mLifeCopy = 0; + mMaxLife = mMaxLifeCopy = 0; + mMagic = mMagicCopy = 0; + mMaxMagic = mMaxMagicCopy = 0; + mOil = mOilCopy = 0; + mMaxOil = mMaxOilCopy = 0; + mOxygen = mOxygenCopy = 0; + mMaxOxygen = mMaxOxygenCopy = 0; + mEnableMagic = mEnableMagicCopy = false; + mEnableArrowDrops = mEnableArrowDropsCopy = false; + mRupees = mRupeesCopy = 0; + mWalletSize = mWalletSizeCopy = WALLET; + mKeys = mKeysCopy = 0; + field_0x23 = field_0x47 = 0; + mEnableOxygenMeter = mEnableOxygenMeterCopy = false; + mPoes = mPoesCopy = 0; + mDonationAmount = mDonationAmountCopy = 0; for (int i = 0; i < 24; i++) { - mItemsCopy[i] = dItemNo_NONE_e; - mItems[i] = dItemNo_NONE_e; + mItems[i] = mItemsCopy[i] = dItemNo_NONE_e; field_0x7a[i] = 0; } for (int i = 0; i < 4; i++) { - mBottleNumCopy[i] = 0; - mBottleNum[i] = 0; + mBottleNum[i] = mBottleNumCopy[i] = 0; } for (int i = 0; i < 3; i++) { - mBombNumCopy[i] = 0; - mBombNum[i] = 0; + mBombNum[i] = mBombNumCopy[i] = 0; } - mScentCopy = dItemNo_NONE_e; - mScent = dItemNo_NONE_e; + mScent = mScentCopy = dItemNo_NONE_e; field_0xa8 = 0; - field_0xf4 = 0; - field_0xea = 0; + field_0xea = field_0xf4 = 0; for (int i = 0; i < 4; i++) { - bool swordBit = dComIfGs_isItemFirstBit(m_sword_item[i]); - mSwordsCopy[i] = swordBit; - mSwords[i] = swordBit; + mSwords[i] = mSwordsCopy[i] = dComIfGs_isItemFirstBit(m_sword_item[i]) ? 1 : 0; } for (int i = 0; i < 3; i++) { - bool shieldBit = dComIfGs_isItemFirstBit(m_shield_item[i]); - mShieldsCopy[i] = shieldBit; - mShields[i] = shieldBit; - - bool clothesBit = dComIfGs_isItemFirstBit(m_cloth_item[i]); - mClothesCopy[i] = clothesBit; - mClothes[i] = clothesBit; + mShields[i] = mShieldsCopy[i] = dComIfGs_isItemFirstBit(m_shield_item[i]) ? 1 : 0; + mClothes[i] = mClothesCopy[i] = dComIfGs_isItemFirstBit(m_cloth_item[i]) ? 1 : 0; } - mBombBagLV2Copy = false; - mBombBagLV2 = false; + mBombBagLV2 = mBombBagLV2Copy = false; for (int i = 0; i < 3; i++) { - mLV2KeyShardsCopy[i] = false; - mLV2KeyShards[i] = false; + mLV2KeyShards[i] = mLV2KeyShardsCopy[i] = false; } for (int i = 0; i < 2; i++) { - mLV5ItemCopy[i] = false; - mLV5Item[i] = false; + mLV5Item[i] = mLV5ItemCopy[i] = false; } for (int i = 0; i < 24; i++) { - mGoldBugCopy[i] = false; - mGoldBug[i] = false; + mGoldBug[i] = mGoldBugCopy[i] = false; } for (int i = 0; i < 8; i++) { - field_0x101[i] = 0; - field_0xf9[i] = 0; - field_0x111[i] = 0; - field_0x109[i] = 0; + field_0xf9[i] = field_0x101[i] = 0; + field_0x109[i] = field_0x111[i] = 0; } for (int i = 0; i < 4; i++) { - mFusedShadowCopy[i] = false; - mFusedShadow[i] = false; + mFusedShadow[i] = mFusedShadowCopy[i] = false; } for (int i = 0; i < 4; i++) { - mMirrorShardCopy[i] = false; - mMirrorShard[i] = false; + mMirrorShard[i] = mMirrorShardCopy[i] = false; } } -bool dMw_HIO_c::getBombFlag() { +#if DEBUG +void dMw_HIO_c::genMessage(JORMContext* mctx) { + // "*****Player Status*****" + mctx->genLabel("\n*****プレイヤーの状態*****", 0); + mctx->genCheckBox("魔法使える", &mEnableMagic, 1); + mctx->genCheckBox("矢補給", &mEnableArrowDrops, 1); + mctx->genCheckBox("矢の数無限", &mArrowFlag, 1); + mctx->genCheckBox("パチンコ玉の数無限", &mPachinkoFlag, 1); + mctx->genCheckBox("爆弾の数無限", &mBombFlag, 1); + mctx->genSlider("ライフ", (s16*)&mLife, 0, 80); + mctx->genSlider("ライフ最大", (s16*)&mMaxLife, 0, 100); + mctx->genSlider("魔法メーター", &mMagic, 0, 32); + mctx->genSlider("魔法メーター最大", &mMaxMagic, 0, 32); + mctx->genSlider("カンテラ油", &mOil, 0, 100000); + mctx->genSlider("カンテラ油最大", &mMaxOil, 0, 100000); + mctx->genCheckBox("酸素メーターON", &mEnableOxygenMeter, 1); + mctx->genSlider("酸素メーター", &mOxygen, 0, 100000); + mctx->genSlider("酸素メーター最大", &mMaxOxygen, 0, 100000); + mctx->genSlider("ルピ−", &mRupees, 0, 5000); + mctx->genSlider("財布", &mWalletSize, 0, 2); + mctx->genSlider("鍵", &mKeys, 0, 99); + mctx->genSlider("ゴースト", &mPoes, 0, 60); + mctx->genSlider("お布施総額", &mDonationAmount, 0, 10000); + mctx->genCheckBox("爆弾袋LV2", &mBombBagLV2, 1); + + // "*****Item*****" + mctx->genLabel("\n*****アイテム*****", 0); + mctx->startComboBox("風のロッド", &mItems[0], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("風のロッド", dItemNo_BOOMERANG_e); + mctx->endComboBox(); + + mctx->startComboBox("カンテラ", &mItems[1], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("カンテラ", dItemNo_KANTERA_e); + mctx->endComboBox(); + + mctx->startComboBox("スピナー", &mItems[2], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("スピナー", dItemNo_SPINNER_e); + mctx->endComboBox(); + + mctx->startComboBox("アイアンブーツ", &mItems[3], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("アイアンブーツ", dItemNo_HVY_BOOTS_e); + mctx->endComboBox(); + + mctx->startComboBox("弓矢", &mItems[4], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("弓矢", dItemNo_BOW_e); + mctx->genComboBoxItem("光の矢", dItemNo_LIGHT_ARROW_e); + mctx->genComboBoxItem("ホークアイ+矢", dItemNo_HAWK_ARROW_e); + mctx->genComboBoxItem("爆弾+矢", dItemNo_BOMB_ARROW_e); + mctx->endComboBox(); + + mctx->genSlider("矢の数", &mArrowNum, 0, 100); + + mctx->startComboBox("ホークアイ", &mItems[5], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("ホークアイ", dItemNo_HAWK_EYE_e); + mctx->endComboBox(); + + mctx->startComboBox("鉄球", &mItems[6], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("鉄球", dItemNo_IRONBALL_e); + mctx->endComboBox(); + + mctx->startComboBox("ミラーシールド", &mItems[7], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->endComboBox(); + + mctx->startComboBox("コピーロッド", &mItems[8], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("コピーロッド", dItemNo_COPY_ROD_e); + mctx->endComboBox(); + + mctx->startComboBox("フックショット", &mItems[9], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("フックショット", dItemNo_HOOKSHOT_e); + mctx->endComboBox(); + + mctx->startComboBox("Wフックショット", &mItems[10], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("Wフックショット", dItemNo_W_HOOKSHOT_e); + mctx->endComboBox(); + + for (int i = 0; i < 4; i = i + 1) { + char sp30[8]; + sprintf(sp30, "ビン%d", i + 1); + mctx->startComboBox(sp30, &mItems[11 + i], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("空きビン", dItemNo_EMPTY_BOTTLE_e); + mctx->genComboBoxItem("赤い薬入りビン", dItemNo_RED_BOTTLE_e); + mctx->genComboBoxItem("緑の薬入りビン", dItemNo_GREEN_BOTTLE_e); + mctx->genComboBoxItem("青い薬入りビン", dItemNo_BLUE_BOTTLE_e); + mctx->genComboBoxItem("水入りビン", dItemNo_WATER_BOTTLE_e); + mctx->genComboBoxItem("妖精入りビン", dItemNo_FAIRY_e); + mctx->genComboBoxItem("牛乳入りビン", dItemNo_MILK_BOTTLE_e); + mctx->genComboBoxItem("牛乳半分入りビン", dItemNo_HALF_MILK_BOTTLE_e); + mctx->genComboBoxItem("油入りビン", dItemNo_OIL_BOTTLE_e); + mctx->genComboBoxItem("まずいスープ", dItemNo_UGLY_SOUP_e); + mctx->genComboBoxItem("温泉水入りビン", dItemNo_HOT_SPRING_e); + mctx->genComboBoxItem("最初にもらうスープ", dItemNo_LV1_SOUP_e); + mctx->genComboBoxItem("材料が1つ入ったスープ", dItemNo_LV2_SOUP_e); + mctx->genComboBoxItem("完成したスープ", dItemNo_LV3_SOUP_e); + mctx->genComboBoxItem("ポウの炎1", dItemNo_POU_FIRE1_e); + mctx->genComboBoxItem("ポウの炎2", dItemNo_POU_FIRE2_e); + mctx->genComboBoxItem("ポウの炎3", dItemNo_POU_FIRE3_e); + mctx->genComboBoxItem("ポウの炎4", dItemNo_POU_FIRE4_e); + mctx->genComboBoxItem("チュチュゼリー赤", dItemNo_CHUCHU_RED_e); + mctx->genComboBoxItem("チュチュゼリー青", dItemNo_CHUCHU_BLUE_e); + mctx->genComboBoxItem("チュチュゼリー緑", dItemNo_CHUCHU_GREEN_e); + mctx->genComboBoxItem("チュチュゼリー黄", dItemNo_CHUCHU_YELLOW_e); + mctx->genComboBoxItem("チュチュゼリー紫", dItemNo_CHUCHU_PURPLE_e); + mctx->genComboBoxItem("チュチュゼリーレア", dItemNo_CHUCHU_RARE_e); + mctx->genComboBoxItem("チュチュゼリー黒", dItemNo_CHUCHU_BLACK_e); + mctx->genComboBoxItem("妖精", dItemNo_FAIRY_e); + mctx->genComboBoxItem("カブトムシ♂", dItemNo_M_BEETLE_e); + mctx->genComboBoxItem("カブトムシ♀", dItemNo_F_BEETLE_e); + mctx->genComboBoxItem("チョウチョ♂", dItemNo_M_BUTTERFLY_e); + mctx->genComboBoxItem("チョウチョ♀", dItemNo_F_BUTTERFLY_e); + mctx->genComboBoxItem("クワガタ♂", dItemNo_M_STAG_BEETLE_e); + mctx->genComboBoxItem("クワガタ♀", dItemNo_F_STAG_BEETLE_e); + mctx->genComboBoxItem("バッタ♂", dItemNo_M_GRASSHOPPER_e); + mctx->genComboBoxItem("バッタ♀", dItemNo_F_GRASSHOPPER_e); + mctx->genComboBoxItem("ナナフシ♂", dItemNo_M_NANAFUSHI_e); + mctx->genComboBoxItem("ナナフシ♀", dItemNo_F_NANAFUSHI_e); + mctx->genComboBoxItem("ダンゴムシ♂", dItemNo_M_DANGOMUSHI_e); + mctx->genComboBoxItem("ダンゴムシ♀", dItemNo_F_DANGOMUSHI_e); + mctx->genComboBoxItem("カマキリ♂", dItemNo_M_MANTIS_e); + mctx->genComboBoxItem("カマキリ♀", dItemNo_F_MANTIS_e); + mctx->genComboBoxItem("テントウムシ♂", dItemNo_M_LADYBUG_e); + mctx->genComboBoxItem("テントウムシ♀", dItemNo_F_LADYBUG_e); + mctx->genComboBoxItem("カタツムリ♂", dItemNo_M_SNAIL_e); + mctx->genComboBoxItem("カタツムリ♀", dItemNo_F_SNAIL_e); + mctx->genComboBoxItem("トンボ♂", dItemNo_M_DRAGONFLY_e); + mctx->genComboBoxItem("トンボ♀", dItemNo_F_DRAGONFLY_e); + mctx->genComboBoxItem("アリ♂", dItemNo_M_ANT_e); + mctx->genComboBoxItem("アリ♀", dItemNo_F_ANT_e); + mctx->genComboBoxItem("カゲロウ♂", dItemNo_M_MAYFLY_e); + mctx->genComboBoxItem("カゲロウ♀", dItemNo_F_MAYFLY_e); + mctx->genComboBoxItem("蜂の子", dItemNo_BEE_CHILD_e); + mctx->genComboBoxItem("みみず", dItemNo_WORM_e); + mctx->genComboBoxItem("大妖精の滴", dItemNo_FAIRY_DROP_e); + mctx->endComboBox(); + + mctx->genSlider("アイテムの数", &mBottleNum[i], 0, 10); + } + + for (int i = 0; i < 3; i = i + 1) { + char sp38[8]; + sprintf(sp38, "爆弾袋%d", i + 1); + mctx->startComboBox(sp38, &mItems[15 + i], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("爆弾袋", dItemNo_BOMB_BAG_LV1_e); + mctx->genComboBoxItem("ノーマル爆弾", dItemNo_NORMAL_BOMB_e); + mctx->genComboBoxItem("水中爆弾", dItemNo_WATER_BOMB_e); + mctx->genComboBoxItem("ポケ虫", dItemNo_POKE_BOMB_e); + mctx->endComboBox(); + + mctx->genSlider("爆弾の数", &mBombNum[i], 0, 99); + } + + mctx->startComboBox("天空人", &mItems[18], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("天空人", dItemNo_DUNGEON_EXIT_e); + mctx->genComboBoxItem("天空人の息子", dItemNo_DUNGEON_BACK_e); + mctx->genComboBoxItem("天空人の書置き", dItemNo_TKS_LETTER_e); + mctx->genComboBoxItem("再開時の天空人", dItemNo_DUNGEON_EXIT_2_e); + mctx->endComboBox(); + + mctx->startComboBox("メモ", &mItems[19], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("ラフレルのメモ", dItemNo_RAFRELS_MEMO_e); + mctx->genComboBoxItem("アッシュの走り書き", dItemNo_ASHS_SCRIBBLING_e); + mctx->endComboBox(); + + mctx->startComboBox("釣竿", &mItems[20], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("珊瑚の耳飾り", dItemNo_ZORAS_JEWEL_e); + mctx->genComboBoxItem("釣竿", dItemNo_FISHING_ROD_1_e); + mctx->genComboBoxItem("釣竿+蜂の子", dItemNo_BEE_ROD_e); + mctx->genComboBoxItem("釣竿+みみず", dItemNo_WORM_ROD_e); + mctx->genComboBoxItem("珊瑚+釣竿", dItemNo_JEWEL_ROD_e); + mctx->genComboBoxItem("珊瑚+釣竿+蜂の子", dItemNo_JEWEL_BEE_ROD_e); + mctx->genComboBoxItem("珊瑚+釣竿+みみず", dItemNo_JEWEL_WORM_ROD_e); + mctx->endComboBox(); + + mctx->startComboBox("わらしべアイテム", &mItems[21], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("レナードの手紙", dItemNo_LETTER_e); + mctx->genComboBoxItem("請求書", dItemNo_BILL_e); + mctx->genComboBoxItem("木彫りの像", dItemNo_WOOD_STATUE_e); + mctx->genComboBoxItem("イリアのペンダント", dItemNo_IRIAS_PENDANT_e); + mctx->genComboBoxItem("馬笛", dItemNo_HORSE_FLUTE_e); + mctx->endComboBox(); + + mctx->startComboBox("古文書", &mItems[22], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("天空の古文書", dItemNo_ANCIENT_DOCUMENT_e); + mctx->genComboBoxItem("天空文字", dItemNo_AIR_LETTER_e); + mctx->genComboBoxItem("解封の古文書", dItemNo_ANCIENT_DOCUMENT2_e); + mctx->endComboBox(); + + char sp40[8]; + sprintf(sp40, "パチンコ"); + mctx->startComboBox(sp40, &mItems[23], 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("未装備", dItemNo_NONE_e); + mctx->genComboBoxItem("パチンコ", dItemNo_PACHINKO_e); + mctx->endComboBox(); + + mctx->genSlider("パチンコ玉の数", &mSeedNum, 0, 50); + + // "*****Collect*****" + mctx->genLabel("\n*****コレクト*****", 0); + mctx->genCheckBox("コキリの服", &mClothes[0], 1); + mctx->genCheckBox("装甲服", &mClothes[1], 1); + mctx->genCheckBox("ゾーラの服", &mClothes[2], 1); + mctx->genCheckBox("木刀", &mSwords[3], 1); + mctx->genCheckBox("金剛の剣", &mSwords[0], 1); + mctx->genCheckBox("マスターソード", &mSwords[1], 1); + mctx->genCheckBox("ライトニングソード", &mSwords[2], 1); + mctx->genCheckBox("木彫りの盾", &mShields[2], 1); + mctx->genCheckBox("木の盾", &mShields[0], 1); + mctx->genCheckBox("ハイリアの盾", &mShields[1], 1); + mctx->genCheckBox("LV2ボス鍵かけら1", &mLV2KeyShards[0], 1); + mctx->genCheckBox("LV2ボス鍵かけら2", &mLV2KeyShards[1], 1); + mctx->genCheckBox("LV2ボス鍵かけら3", &mLV2KeyShards[2], 1); + mctx->genCheckBox("かぼちゃ", &mLV5Item[0], 1); + mctx->genCheckBox("トアル産チーズ", &mLV5Item[1], 1); + + mctx->startComboBox("におい", &mScent, 0, NULL, 0xFFFF, 0xFFFF, 256, 26); + mctx->genComboBoxItem("覚えてない", dItemNo_NONE_e); + mctx->genComboBoxItem("かぼちゃのにおい(削除)", dItemNo_SMELL_PUMPKIN_e); + mctx->genComboBoxItem("イリアのポーチのにおい", dItemNo_SMELL_YELIA_POUCH_e); + mctx->genComboBoxItem("魚のにおい", dItemNo_SMELL_FISH_e); + mctx->genComboBoxItem("ポウのにおい", dItemNo_SMELL_POH_e); + mctx->genComboBoxItem("子供のにおい", dItemNo_SMELL_CHILDREN_e); + mctx->genComboBoxItem("薬品のにおい", dItemNo_SMELL_MEDICINE_e); + mctx->endComboBox(); + + for (int i = 0; i < 24; i = i + 1) { + static const char* insect_name[] = { + "カブトムシ♂", "カブトムシ♀", + "チョウチョ♂", "チョウチョ♀", + "クワガタ♂", "クワガタ♀", + "バッタ♂", "バッタ♀", + "ナナフシ♂", "ナナフシ♀", + "ダンゴムシ♂", "ダンゴムシ♀", + "カマキリ♂", "カマキリ♀", + "テントウムシ♂", "テントウムシ♀", + "カタツムリ♂", "カタツムリ♀", + "トンボ♂", "トンボ♀", + "アリ♂", "アリ♀", + "カゲロウ♂", "カゲロウ♀", + }; + + mctx->genCheckBox(insect_name[i], &mGoldBug[i], 1); + } + + // "*****Fused Shadows*****" + mctx->genLabel("\n*****影の水晶石*****", 0); + char sp28[24]; + for (int i = 0; i < 4; i = i + 1) { + sprintf(sp28, "影の水晶石%d", i + 1); + mctx->genCheckBox(sp28, &mFusedShadow[i], 1); + } + + // "*****Mirror Shards*****" + mctx->genLabel("\n*****陰りの鏡*****", 0); + for (int i = 0; i < 4; i = i + 1) { + sprintf(sp28, "陰りの鏡%d", i + 1); + mctx->genCheckBox(sp28, &mMirrorShard[i], 1); + } +} + +void dMw_HIO_c::update() { + JORMContext* mctx = attachJORMContext(8); + mctx->startUpdateNode(this); + mctx->updateCheckBox(2, &mArrowFlag, 1, 0); + mctx->updateCheckBox(2, &mBombFlag, 1, 0); + mctx->endUpdateNode(); + releaseJORMContext(mctx); +} + +void dMw_HIO_c::playerStatusHIO() { + JORMContext* mctx = attachJORMContext(8); + + if (mLife != mLifeCopy) { + s16 sp10 = mLife - dComIfGs_getLife(); + dComIfGp_clearItemLifeCount(); + dComIfGp_setItemLifeCount(sp10, 0); + mLifeCopy = mLife; + } else if (mLifeCopy != dComIfGs_getLife()) { + mLife = mLifeCopy = dComIfGs_getLife(); + mctx->updateSlider(2, &mLife, 0, 0, 0); + } + + if (mMaxLifeCopy != mMaxLife) { + s16 spE = mMaxLife - dComIfGs_getMaxLife(); + dComIfGp_clearItemMaxLifeCount(); + dComIfGp_setItemMaxLifeCount(spE); + mMaxLifeCopy = mMaxLife; + } else if (mMaxLifeCopy != dComIfGs_getMaxLife()) { + mMaxLife = mMaxLifeCopy = dComIfGs_getMaxLife(); + mctx->updateSlider(2, &mMaxLife, 0, 0, 0); + } + + if (mMagicCopy != mMagic) { + s16 spC = mMagic - dComIfGs_getMagic(); + dComIfGp_setItemMagicCount(spC); + mMagicCopy = mMagic; + } else if (mMagicCopy != dComIfGs_getMagic()) { + mMagic = mMagicCopy = dComIfGs_getMagic(); + mctx->updateSlider(2, &mMagic, 0, 0, 0); + } + + if (mMaxMagicCopy != mMaxMagic) { + s16 spB = mMaxMagic - dComIfGs_getMaxMagic(); + dComIfGp_setItemMaxMagicCount(spB); + mMaxMagicCopy = mMaxMagic; + } else if (mMaxMagicCopy != dComIfGs_getMaxMagic()) { + mMaxMagic = mMaxMagicCopy = dComIfGs_getMaxMagic(); + mctx->updateSlider(2, &mMaxMagic, 0, 0, 0); + } + + if (mOilCopy != mOil) { + s32 sp2C = mOil - dComIfGs_getOil(); + dComIfGp_setItemOilCount(sp2C); + mOilCopy = mOil; + } else if (mOilCopy != dComIfGs_getOil()) { + mOil = mOilCopy = dComIfGs_getOil(); + mctx->updateSlider(2, &mOil, 0, 0, 0); + } + + if (mMaxOilCopy != mMaxOil) { + s32 sp30 = mMaxOil - dComIfGs_getMaxOil(); + dComIfGp_setItemMaxOilCount(sp30); + mMaxOilCopy = mMaxOil; + } else if (mMaxOilCopy != dComIfGs_getMaxOil()) { + mMaxOil = mMaxOilCopy = dComIfGs_getMaxOil(); + mctx->updateSlider(2, &mMaxOil, 0, 0, 0); + } + + if (mEnableOxygenMeterCopy != mEnableOxygenMeter) { + if (mEnableOxygenMeter) { + dComIfGp_onOxygenShowFlag(); + } else { + dComIfGp_offOxygenShowFlag(); + } + mEnableOxygenMeterCopy = mEnableOxygenMeter; + } else if (mEnableOxygenMeterCopy != dComIfGp_getOxygenShowFlag()) { + mEnableOxygenMeter = mEnableOxygenMeterCopy = dComIfGp_getOxygenShowFlag(); + mctx->updateSlider(2, &mEnableOxygenMeter, 0, 0, 0); + } + + if (mOxygenCopy != mOxygen) { + s32 sp30 = mOxygen - dComIfGp_getOxygen(); + dComIfGp_setOxygenCount(sp30); + mOxygenCopy = mOxygen; + } else if (mOxygenCopy != dComIfGp_getOxygen()) { + mOxygen = mOxygenCopy = dComIfGp_getOxygen(); + mctx->updateSlider(2, &mOxygen, 0, 0, 0); + } + + if (mMaxOxygenCopy != mMaxOxygen) { + s32 sp30 = mMaxOxygen - dComIfGp_getMaxOxygen(); + dComIfGp_setMaxOxygenCount(sp30); + mMaxOxygenCopy = mMaxOxygen; + } else if (mMaxOxygenCopy != dComIfGp_getMaxOxygen()) { + mMaxOxygen = mMaxOxygenCopy = dComIfGp_getMaxOxygen(); + mctx->updateSlider(2, &mMaxOxygen, 0, 0, 0); + } + + if (mRupeesCopy != mRupees) { + s32 sp30 = mRupees - dComIfGs_getRupee(); + dComIfGp_clearItemRupeeCount(); + dComIfGp_setItemRupeeCount(sp30); + mRupeesCopy = mRupees; + } else if (mRupeesCopy != dComIfGs_getRupee()) { + mRupees = mRupeesCopy = dComIfGs_getRupee(); + mctx->updateSlider(2, &mRupees, 0, 0, 0); + } + + if (mWalletSizeCopy != mWalletSize) { + mWalletSizeCopy = mWalletSize; + dComIfGs_setWalletSize(mWalletSize); + } else if (mWalletSizeCopy != (s16)dComIfGs_getWalletSize()) { + mWalletSize = mWalletSizeCopy = dComIfGs_getWalletSize(); + mctx->updateSlider(2, &mWalletSize, 0, 0, 0); + } + + if (mKeysCopy != mKeys) { + s16 sp30 = mKeys - dComIfGs_getKeyNum(); + dComIfGp_clearItemKeyNumCount(); + dComIfGp_setItemKeyNumCount(sp30); + mKeysCopy = mKeys; + } else if (mKeysCopy != dComIfGs_getKeyNum()) { + mKeys = mKeysCopy = dComIfGs_getKeyNum(); + mctx->updateSlider(2, &mKeys, 0, 0, 0); + } + + if (mPoesCopy != mPoes) { + dComIfGs_setPohSpiritNum(mPoes); + mPoesCopy = mPoes; + } else if (mPoesCopy != dComIfGs_getPohSpiritNum()) { + mPoes = mPoesCopy = dComIfGs_getPohSpiritNum(); + mctx->updateSlider(2, &mPoes, 0, 0, 0); + } + + if (mDonationAmountCopy != mDonationAmount) { + dMsgObject_setOffering(mDonationAmount); + mDonationAmountCopy = mDonationAmount; + } else if (mDonationAmountCopy != dMsgObject_getOffering()) { + mDonationAmount = mDonationAmountCopy = dMsgObject_getOffering(); + mctx->updateSlider(2, &mDonationAmount, 0, 0, 0); + } + + releaseJORMContext(mctx); +} +#endif + +u8 dMw_HIO_c::getBombFlag() { + #if DEBUG + if (mDoCPd_c::isConnect(PAD_3)) { + return mBombFlag; + } else if (mDoCPd_c::isConnect(PAD_3)) { + return mBombFlag; + } else { + return false; + } + #else return false; + #endif } -bool dMw_HIO_c::getArrowFlag() { +u8 dMw_HIO_c::getArrowFlag() { + #if DEBUG + if (mDoCPd_c::isConnect(PAD_3)) { + return mArrowFlag; + } else { + return false; + } + #else return false; + #endif } -bool dMw_HIO_c::getPachinkoFlag() { +u8 dMw_HIO_c::getPachinkoFlag() { + #if DEBUG + if (mDoCPd_c::isConnect(PAD_3)) { + return mPachinkoFlag; + } else { + return false; + } + #else return false; + #endif +} + +#if DEBUG +void dMw_HIO_c::itemBitCheck() { + JORMContext* mctx = attachJORMContext(8); + u8 var_r29; + + if (dComIfGs_isGetMagicUseFlag()) + var_r29 = 1; + else + var_r29 = 0; + + if (mEnableMagicCopy != var_r29) { + mEnableMagicCopy = mEnableMagic; + mEnableMagic = var_r29; + mctx->updateSlider(2, &mEnableMagic, 0, 0, 0); + } + + if (mEnableArrowDrops != mEnableArrowDropsCopy) { + mEnableArrowDropsCopy = mEnableArrowDrops; + if (mEnableArrowDrops) { + dComIfGs_onItemFirstBit(dItemNo_BOW_e); + } else { + dComIfGs_offItemFirstBit(dItemNo_BOW_e); + } + } + + if (mEnableArrowDrops != (u8)dComIfGs_isItemFirstBit(dItemNo_BOW_e)) { + mEnableArrowDrops = mEnableArrowDropsCopy = dComIfGs_isItemFirstBit(dItemNo_BOW_e); + + JORMContext* mctx = attachJORMContext(8); + mctx->startUpdateNode(this); + mctx->updateCheckBox(2, &mEnableArrowDrops, 1, 0); + mctx->endUpdateNode(); + releaseJORMContext(mctx); + } + + for (int i = 0; i < 24; i++) { + if (mItemsCopy[i] != dComIfGs_getItem((u8)i, false)) { + field_0x7a[i] = 1; + mItemsCopy[i] = mItems[i]; + mItems[i] = dComIfGs_getItem((u8)i, false); + mctx->updateComboBox(2, &mItems[i], 0); + } + } + + if (mScentCopy != dComIfGs_getCollectSmell()) { + field_0xa8 = 1; + mScentCopy = mScent; + mScent = dComIfGs_getCollectSmell(); + mctx->updateComboBox(2, &mScent, 0); + } + + var_r29 = field_0x101[0]; + if (dComIfGs_isCollectClothes(2)) { + var_r29 = 3; + } else if (dComIfGs_isCollectClothes(1)) { + var_r29 = 2; + } else if (dComIfGs_isCollectClothes(0)) { + var_r29 = 1; + } else { + var_r29 = 0; + } + + if (field_0x101[0] != var_r29) { + field_0x101[0] = field_0xf9[0]; + field_0xf9[0] = var_r29; + mctx->updateComboBox(2, &field_0xf9[0], 0); + } + + for (int i = 0; i < 4; i++) { + static u8 m_sword_item[] = {dItemNo_SWORD_e, dItemNo_MASTER_SWORD_e, dItemNo_LIGHT_SWORD_e, dItemNo_WOOD_STICK_e}; + if (dComIfGs_isItemFirstBit(m_sword_item[i])) + var_r29 = 1; + else + var_r29 = 0; + + if (mSwordsCopy[i] != var_r29) { + mSwordsCopy[i] = mSwords[i]; + mSwords[i] = var_r29; + mctx->updateSlider(2, &mSwords[i], 0, 0, 0); + } + } + + for (int i = 0; i < 3; i++) { + static u8 m_cloth_item[] = {dItemNo_WEAR_KOKIRI_e, dItemNo_ARMOR_e, dItemNo_WEAR_ZORA_e}; + if (dComIfGs_isItemFirstBit(m_cloth_item[i])) + var_r29 = 1; + else + var_r29 = 0; + + if (mClothesCopy[i] != var_r29) { + mClothesCopy[i] = mClothes[i]; + mClothes[i] = var_r29; + mctx->updateSlider(2, &mClothes[i], 0, 0, 0); + } + + static u8 m_shield_item[] = {dItemNo_SHIELD_e, dItemNo_HYLIA_SHIELD_e, dItemNo_WOOD_SHIELD_e}; + if (dComIfGs_isItemFirstBit(m_shield_item[i])) + var_r29 = 1; + else + var_r29 = 0; + + if (mShieldsCopy[i] != var_r29) { + mShieldsCopy[i] = mShields[i]; + mShields[i] = var_r29; + mctx->updateSlider(2, &mShields[i], 0, 0, 0); + } + } + + if (dComIfGs_isItemFirstBit(dItemNo_BOMB_BAG_LV2_e)) + var_r29 = 1; + else + var_r29 = 0; + + if (mBombBagLV2Copy != var_r29) { + mBombBagLV2Copy = mBombBagLV2; + mBombBagLV2 = var_r29; + mctx->updateSlider(2, &mBombBagLV2, 0, 0, 0); + } + + for (int i = 0; i < 3; i++) { + static u8 m_lv2_dun_key[] = {dItemNo_L2_KEY_PIECES1_e, dItemNo_L2_KEY_PIECES2_e, dItemNo_L2_KEY_PIECES3_e}; + if (dComIfGs_isItemFirstBit(m_lv2_dun_key[i])) + var_r29 = 1; + else + var_r29 = 0; + + if (mLV2KeyShardsCopy[i] != var_r29) { + mLV2KeyShardsCopy[i] = mLV2KeyShards[i]; + mLV2KeyShards[i] = var_r29; + mctx->updateSlider(2, &mLV2KeyShards[i], 0, 0, 0); + } + } + + for (int i = 0; i < 2; i++) { + static u8 m_lv5_dun_item[] = {dItemNo_TOMATO_PUREE_e, dItemNo_TASTE_e}; + if (dComIfGs_isItemFirstBit(m_lv5_dun_item[i])) + var_r29 = 1; + else + var_r29 = 0; + + if (mLV5ItemCopy[i] != var_r29) { + mLV5ItemCopy[i] = mLV5Item[i]; + mLV5Item[i] = var_r29; + mctx->updateSlider(2, &mLV5Item[i], 0, 0, 0); + } + } + + for (int i = 0; i < 24; i++) { + if (dComIfGs_isItemFirstBit(i + dItemNo_M_BEETLE_e)) + var_r29 = 1; + else + var_r29 = 0; + + if (mGoldBugCopy[i] != var_r29) { + mGoldBugCopy[i] = mGoldBug[i]; + mGoldBug[i] = var_r29; + mctx->updateSlider(2, &mGoldBug[i], 0, 0, 0); + } + } + + var_r29 = field_0x101[1]; + if (dComIfGs_isCollectSword(1)) { + var_r29 = 2; + } else if (dComIfGs_isCollectSword(0)) { + var_r29 = 1; + } else if (dComIfGs_isCollectSword(2)) { + var_r29 = 3; + } else if (dComIfGs_isCollectSword(3)) { + var_r29 = 4; + } else { + var_r29 = 0; + } + + if (field_0x101[1] != var_r29) { + field_0x101[1] = field_0xf9[1]; + field_0xf9[1] = var_r29; + mctx->updateComboBox(2, &field_0xf9[1], 0); + } + + var_r29 = field_0x101[2]; + if (dComIfGs_isCollectShield(3)) { + var_r29 = 4; + } else if (dComIfGs_isCollectShield(2)) { + var_r29 = 3; + } else if (dComIfGs_isCollectShield(1)) { + var_r29 = 2; + } else if (dComIfGs_isCollectShield(0)) { + var_r29 = 1; + } else { + var_r29 = 0; + } + + if (field_0x101[2] != var_r29) { + field_0x101[2] = field_0xf9[2]; + field_0xf9[2] = var_r29; + mctx->updateComboBox(2, &field_0xf9[2], 0); + } + + for (int i = 0; i < 4; i++) { + if (dComIfGs_isCollectCrystal(i)) + var_r29 = 1; + else + var_r29 = 0; + + if (mFusedShadowCopy[i] != var_r29) { + mFusedShadowCopy[i] = mFusedShadow[i]; + mFusedShadow[i] = var_r29; + mctx->updateSlider(2, &mFusedShadow[i], 0, 0, 0); + } + } + + for (int i = 0; i < 4; i++) { + if (dComIfGs_isCollectMirror(i)) + var_r29 = 1; + else + var_r29 = 0; + + if (mMirrorShardCopy[i] != var_r29) { + mMirrorShardCopy[i] = mMirrorShard[i]; + mMirrorShard[i] = var_r29; + mctx->updateSlider(2, &mMirrorShard[i], 0, 0, 0); + } + } + + releaseJORMContext(mctx); } +void dMw_HIO_c::itemNumHIO() { + JORMContext* mctx = attachJORMContext(8); + + if (mArrowNumCopy != mArrowNum) { + s16 count = mArrowNum - dComIfGs_getArrowNum(); + dComIfGp_setItemArrowNumCount(count); + mArrowNumCopy = mArrowNum; + } else if (mArrowNumCopy != dComIfGs_getArrowNum()) { + mArrowNum = mArrowNumCopy = dComIfGs_getArrowNum(); + mctx->updateSlider(2, &mArrowNum, 0, 0, 0); + } + + for (int i = 0; i < 4; i++) { + if (mBottleNumCopy[i] != mBottleNum[i]) { + s16 count = mBottleNum[i] - dComIfGs_getBottleNum(i); + dComIfGs_addBottleNum(i, count); + mBottleNumCopy[i] = mBottleNum[i]; + } else if (mBottleNumCopy[i] != dComIfGs_getBottleNum(i)) { + mBottleNum[i] = mBottleNumCopy[i] = dComIfGs_getBottleNum(i); + mctx->updateSlider(2, &mBottleNum[i], 0, 0, 0); + } + } + + for (int i = 0; i < 3; i++) { + if (mBombNumCopy[i] != mBombNum[i]) { + s16 count = mBombNum[i] - dComIfGs_getBombNum(i); + dComIfGp_setItemBombNumCount(i, count); + mBombNumCopy[i] = mBombNum[i]; + } else if (mBombNumCopy[i] != dComIfGs_getBombNum(i)) { + mBombNum[i] = mBombNumCopy[i] = dComIfGs_getBombNum(i); + mctx->updateSlider(2, &mBombNum[i], 0, 0, 0); + } + } + + if (mSeedNumCopy != mSeedNum) { + s16 count = mSeedNum - dComIfGs_getPachinkoNum(); + dComIfGp_setItemPachinkoNumCount(count); + mSeedNumCopy = mSeedNum; + } else if (mSeedNumCopy != dComIfGs_getPachinkoNum()) { + mSeedNum = mSeedNumCopy = dComIfGs_getPachinkoNum(); + mctx->updateSlider(2, &mSeedNum, 0, 0, 0); + } + + releaseJORMContext(mctx); +} + +void dMw_HIO_c::itemHIO() { + playerStatusHIO(); + itemNumHIO(); + itemBitCheck(); + + JORMContext* mctx = attachJORMContext(8); + + if (mEnableMagic != mEnableMagicCopy) { + mEnableMagicCopy = mEnableMagic; + if (mEnableMagic) { + dComIfGs_onGetMagicUseFlag(); + } else { + dComIfGs_offGetMagicUseFlag(); + } + } + + if (mEnableMagic != (u8)dComIfGs_isGetMagicUseFlag()) { + mEnableMagic = mEnableMagicCopy = dComIfGs_isGetMagicUseFlag(); + + JORMContext* mctx = attachJORMContext(8); + mctx->startUpdateNode(this); + mctx->updateCheckBox(2, &mEnableMagic, 1, 0); + mctx->endUpdateNode(); + releaseJORMContext(mctx); + } + + if (mEnableArrowDrops != mEnableArrowDropsCopy) { + mEnableArrowDropsCopy = mEnableArrowDrops; + if (mEnableArrowDrops) { + dComIfGs_onItemFirstBit(dItemNo_BOW_e); + } else { + dComIfGs_offItemFirstBit(dItemNo_BOW_e); + } + } + + if (mEnableArrowDrops != (u8)dComIfGs_isItemFirstBit(dItemNo_BOW_e)) { + mEnableArrowDrops = mEnableArrowDropsCopy = dComIfGs_isItemFirstBit(dItemNo_BOW_e); + + JORMContext* mctx = attachJORMContext(8); + mctx->startUpdateNode(this); + mctx->updateCheckBox(2, &mEnableArrowDrops, 1, 0); + mctx->endUpdateNode(); + releaseJORMContext(mctx); + } + + for (int i = 0; i < 24; i++) { + if (mItems[i] != mItemsCopy[i]) { + if (i == 20 && field_0x7a[i] == 0) { + switch (mItems[i]) { + case dItemNo_NONE_e: + case dItemNo_FISHING_ROD_1_e: + case dItemNo_BEE_ROD_e: + case dItemNo_WORM_ROD_e: + dComIfGs_offItemFirstBit(dItemNo_ZORAS_JEWEL_e); + break; + case dItemNo_JEWEL_ROD_e: + case dItemNo_JEWEL_BEE_ROD_e: + case dItemNo_JEWEL_WORM_ROD_e: + case dItemNo_ZORAS_JEWEL_e: + dComIfGs_onItemFirstBit(dItemNo_ZORAS_JEWEL_e); + break; + } + } + + dComIfGs_setItem((u8)i, mItems[i]); + + if (mItems[i] == dItemNo_HOT_SPRING_e) { + dMeter2Info_setHotSpringTimer(i); + } + + if (mItems[i] == dItemNo_BEE_CHILD_e && field_0x7a[i] == 0) { + dComIfGs_setBottleNum(i - 11, dComIfGs_getBottleMax()); + } + + mItemsCopy[i] = mItems[i]; + field_0x7a[i] = 0; + } + } + + if (mScent != mScentCopy) { + dMsgObject_setSmellType(mScent); + mScentCopy = mScent; + field_0xa8 = 0; + } + + for (int i = 0; i < 4; i++) { + if (mSwords[i] != mSwordsCopy[i]) { + static u8 m_sword_item[] = {dItemNo_SWORD_e, dItemNo_MASTER_SWORD_e, dItemNo_LIGHT_SWORD_e, dItemNo_WOOD_STICK_e}; + if (mSwords[i] != 0) { + dComIfGs_onItemFirstBit(m_sword_item[i]); + } else { + dComIfGs_offItemFirstBit(m_sword_item[i]); + if (m_sword_item[i] == dComIfGs_getSelectEquipSword()) { + dMeter2Info_setSword(dItemNo_NONE_e, false); + } + } + + mSwordsCopy[i] = mSwords[i]; + } + } + + for (int i = 0; i < 3; i++) { + if (mClothes[i] != mClothesCopy[i]) { + static u8 m_cloth_item[] = {dItemNo_WEAR_KOKIRI_e, dItemNo_ARMOR_e, dItemNo_WEAR_ZORA_e}; + if (mClothes[i] != 0) { + dComIfGs_onItemFirstBit(m_cloth_item[i]); + } else { + dComIfGs_offItemFirstBit(m_cloth_item[i]); + + } + mClothesCopy[i] = mClothes[i]; + } + + if (mShields[i] != mShieldsCopy[i]) { + static u8 m_shield_item[] = {dItemNo_SHIELD_e, dItemNo_HYLIA_SHIELD_e, dItemNo_WOOD_SHIELD_e}; + if (mShields[i] != 0) { + dComIfGs_onItemFirstBit(m_shield_item[i]); + } else { + dComIfGs_offItemFirstBit(m_shield_item[i]); + + } + mShieldsCopy[i] = mShields[i]; + } + } + + if (mBombBagLV2 != mBombBagLV2Copy) { + if (mBombBagLV2) { + dComIfGs_onItemFirstBit(dItemNo_BOMB_BAG_LV2_e); + } else { + dComIfGs_offItemFirstBit(dItemNo_BOMB_BAG_LV2_e); + } + mBombBagLV2Copy = mBombBagLV2; + } + + for (int i = 0; i < 3; i++) { + static u8 m_lv2_dun_key[] = {dItemNo_L2_KEY_PIECES1_e, dItemNo_L2_KEY_PIECES2_e, dItemNo_L2_KEY_PIECES3_e}; + if (mLV2KeyShards[i] != mLV2KeyShardsCopy[i]) { + if (mLV2KeyShards[i] != 0) { + dComIfGs_onItemFirstBit(m_lv2_dun_key[i]); + } else { + dComIfGs_offItemFirstBit(m_lv2_dun_key[i]); + } + mLV2KeyShardsCopy[i] = mLV2KeyShards[i]; + } + } + + for (int i = 0; i < 2; i++) { + static u8 m_lv5_dun_item[] = {dItemNo_TOMATO_PUREE_e, dItemNo_TASTE_e}; + if (mLV5Item[i] != mLV5ItemCopy[i]) { + if (mLV5Item[i] != 0) { + dComIfGs_onItemFirstBit(m_lv5_dun_item[i]); + } else { + dComIfGs_offItemFirstBit(m_lv5_dun_item[i]); + } + mLV5ItemCopy[i] = mLV5Item[i]; + } + } + + for (int i = 0; i < 24; i++) { + if (mGoldBug[i] != mGoldBugCopy[i]) { + if (mGoldBug[i] != 0) { + dComIfGs_onItemFirstBit(i + dItemNo_M_BEETLE_e); + } else { + dComIfGs_offItemFirstBit(i + dItemNo_M_BEETLE_e); + } + mGoldBugCopy[i] = mGoldBug[i]; + } + } + + for (int i = 0; i < 3; i++) { + if (i == 0) { + if (g_playerKind == 2) { + field_0xf9[i] = 0; + } else if (g_playerKind == 3) { + field_0xf9[i] = 1; + } else if (g_playerKind == 4) { + field_0xf9[i] = 2; + } + } + + if (field_0xf9[i] != field_0x101[i]) { + switch (i) { + case 0: + for (int j = 0; j < 8; j++) { + dComIfGs_offCollectClothes(j); + } + + if (field_0xf9[i] != 0) { + dComIfGs_setCollectClothes(field_0xf9[i] - 1); + } else { + dComIfGs_setSelectEquipClothes(dItemNo_WEAR_CASUAL_e); + } + break; + case 1: + for (int j = 0; j < 8; j++) { + dComIfGs_offCollectSword(j); + } + + if (field_0xf9[i] != 0) { + dComIfGs_setCollectSword(field_0xf9[i] - 1); + } else { + dComIfGs_setSelectEquipSword(dItemNo_NONE_e); + } + break; + case 2: + for (int j = 0; j < 8; j++) { + dComIfGs_offCollectShield(j); + } + + if (field_0xf9[i] != 0) { + dComIfGs_setCollectShield(field_0xf9[i] - 1); + } else { + dComIfGs_setSelectEquipShield(dItemNo_NONE_e); + } + break; + } + + field_0x101[i] = field_0xf9[i]; + } + } + + for (int i = 0; i < 4; i++) { + if (mFusedShadow[i] != mFusedShadowCopy[i]) { + if (mFusedShadow[i] != 0) { + dComIfGs_onCollectCrystal(i); + } else { + dComIfGs_offCollectCrystal(i); + } + mFusedShadowCopy[i] = mFusedShadow[i]; + } + } + + for (int i = 0; i < 4; i++) { + if (mMirrorShard[i] != mMirrorShardCopy[i]) { + if (mMirrorShard[i] != 0) { + dComIfGs_onCollectMirror(i); + } else { + dComIfGs_offCollectMirror(i); + } + mMirrorShardCopy[i] = mMirrorShard[i]; + } + } + + releaseJORMContext(mctx); +} +#endif + dMw_DHIO_c::dMw_DHIO_c() { for (int i = 0; i < 32; i++) { mMap[i] = false; @@ -163,6 +1101,226 @@ dMw_DHIO_c::dMw_DHIO_c() { } } +#if DEBUG +void dMw_DHIO_c::genMessage(JORMContext* mctx) { + static const char* name_str[] = { + "\n*****0 ラトアーヌ地方*****", + "\n*****1 ハイラル城*****", + "\n*****2 フィローネ地方*****", + "\n*****3 オルディン地方*****", + "\n*****4 ラネール地方*****", + "\n*****5 影の世界*****", + "\n*****6 環状フィールド*****", + "\n*****7 空き*****", + "\n*****8 空き*****", + "\n*****9 空き*****", + "\n*****10 空き*****", + "\n*****11 空き*****", + "\n*****12 空き*****", + "\n*****13 空き*****", + "\n*****14 空き*****", + "\n*****15 空き*****", + "\n*****16 L-1ダンジョン*****", + "\n*****17 L-2ダンジョン*****", + "\n*****18 L-3ダンジョン*****", + "\n*****19 L-4ダンジョン*****", + "\n*****20 L-5ダンジョン*****", + "\n*****21 L-6ダンジョン*****", + "\n*****22 L-7ダンジョン*****", + "\n*****23 L-8ダンジョン*****", + "\n*****24 最終ダンジョン*****", + "\n*****25 空き*****", + "\n*****26 空き*****", + "\n*****27 空き*****", + "\n*****28 空き*****", + "\n*****29 空き*****", + "\n*****30 空き*****", + "\n*****31 デフォルト*****", + }; + + for (int i = 16; i < 25; i++) { + mctx->genLabel(name_str[i], 0); + mctx->genCheckBox("マップ", &mMap[i], 1); + mctx->genCheckBox("コンパス", &mCompass[i], 1); + mctx->genCheckBox("ボス鍵", &mBossKey[i], 1); + mctx->genCheckBox("ワープ", &mPortal[i], 1); + mctx->genCheckBox("中ボス攻略", &mMidBossClear[i], 1); + mctx->genCheckBox("ボス攻略", &mBossClear[i], 1); + mctx->genCheckBox("ハートの器", &mHeartContainer[i], 1); + mctx->genCheckBox("ボスデモ", &mBossDemo[i], 1); + } +} + +void dMw_DHIO_c::bitCheck() { + JORMContext* mctx = attachJORMContext(8); + u8 var_r28; + + for (int i = 0; i < 32; i++) { + if (dComIfGs_isDungeonItemMap(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mMapCopy[i] != var_r28) { + mMapCopy[i] = mMap[i]; + mMap[i] = var_r28; + mctx->updateSlider(2, &mMap[i], 0, 0, 0); + } + + if (mMap[i] != mMapCopy[i]) { + if (mMap[i] != 0) { + dComIfGs_onDungeonItemMap(i); + } else { + dComIfGs_offDungeonItemMap(i); + } + mMapCopy[i] = mMap[i]; + } + + if (dComIfGs_isDungeonItemCompass(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mCompassCopy[i] != var_r28) { + mCompassCopy[i] = mCompass[i]; + mCompass[i] = var_r28; + mctx->updateSlider(2, &mCompass[i], 0, 0, 0); + } + + if (mCompass[i] != mCompassCopy[i]) { + if (mCompass[i] != 0) { + dComIfGs_onDungeonItemCompass(i); + } else { + dComIfGs_offDungeonItemCompass(i); + } + mCompassCopy[i] = mCompass[i]; + } + + if (dComIfGs_isDungeonItemBossKey(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mBossKeyCopy[i] != var_r28) { + mBossKeyCopy[i] = mBossKey[i]; + mBossKey[i] = var_r28; + mctx->updateSlider(2, &mBossKey[i], 0, 0, 0); + } + + if (mBossKey[i] != mBossKeyCopy[i]) { + if (mBossKey[i] != 0) { + dComIfGs_onDungeonItemBossKey(i); + } else { + dComIfGs_offDungeonItemBossKey(i); + } + mBossKeyCopy[i] = mBossKey[i]; + } + + if (dComIfGs_isDungeonItemWarp(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mPortalCopy[i] != var_r28) { + mPortalCopy[i] = mPortal[i]; + mPortal[i] = var_r28; + mctx->updateSlider(2, &mPortal[i], 0, 0, 0); + } + + if (mPortal[i] != mPortalCopy[i]) { + if (mPortal[i] != 0) { + dComIfGs_onDungeonItemWarp(i); + } else { + dComIfGs_offDungeonItemWarp(i); + } + mPortalCopy[i] = mPortal[i]; + } + + if (dComIfGs_isStageBossEnemy(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mBossClearCopy[i] != var_r28) { + mBossClearCopy[i] = mBossClear[i]; + mBossClear[i] = var_r28; + mctx->updateSlider(2, &mBossClear[i], 0, 0, 0); + } + + if (mBossClear[i] != mBossClearCopy[i]) { + if (mBossClear[i] != 0) { + dComIfGs_onStageBossEnemy(i); + } else { + dComIfGs_offStageBossEnemy(i); + } + mBossClearCopy[i] = mBossClear[i]; + } + + if (dComIfGs_isStageMiddleBoss(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mMidBossClearCopy[i] != var_r28) { + mMidBossClearCopy[i] = mMidBossClear[i]; + mMidBossClear[i] = var_r28; + mctx->updateSlider(2, &mMidBossClear[i], 0, 0, 0); + } + + if (mMidBossClear[i] != mMidBossClearCopy[i]) { + if (mMidBossClear[i] != 0) { + dComIfGs_onStageMiddleBoss(i); + } else { + dComIfGs_offStageMiddleBoss(i); + } + mMidBossClearCopy[i] = mMidBossClear[i]; + } + + if (dComIfGs_isStageLife(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mHeartContainerCopy[i] != var_r28) { + mHeartContainerCopy[i] = mHeartContainer[i]; + mHeartContainer[i] = var_r28; + mctx->updateSlider(2, &mHeartContainer[i], 0, 0, 0); + } + + if (mHeartContainer[i] != mHeartContainerCopy[i]) { + if (mHeartContainer[i] != 0) { + dComIfGs_onStageLife(i); + } else { + dComIfGs_offStageLife(i); + } + mHeartContainerCopy[i] = mHeartContainer[i]; + } + + if (dComIfGs_isStageBossDemo(i)) + var_r28 = 1; + else + var_r28 = 0; + + if (mBossDemoCopy[i] != var_r28) { + mBossDemoCopy[i] = mBossDemo[i]; + mBossDemo[i] = var_r28; + mctx->updateSlider(2, &mBossDemo[i], 0, 0, 0); + } + + if (mBossDemo[i] != mBossDemoCopy[i]) { + if (mBossDemo[i] != 0) { + dComIfGs_onStageBossDemo(i); + } else { + dComIfGs_offStageBossDemo(i); + } + mBossDemoCopy[i] = mBossDemo[i]; + } + } + + releaseJORMContext(mctx); +} +#endif + dMw_HIO_c g_mwHIO; dMw_DHIO_c g_mwDHIO;