From ca36a0123cba816ece0149ef663f8fbaf233a024 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 22 Nov 2024 13:13:02 +0100 Subject: [PATCH] More --- config/SOUE01/symbols.txt | 4 +- include/d/a/d_a_base.h | 3 +- include/d/a/d_a_player.h | 2 + include/d/a/obj/d_a_obj_tbox.h | 6 +- src/d/a/d_a_base.cpp | 2 +- src/d/a/obj/d_a_obj_tbox.cpp | 244 ++++++++++++++++++++++++++++++++- 6 files changed, 249 insertions(+), 12 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 4a925660..53bf26f3 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -14345,8 +14345,8 @@ fn_8026D950 = .text:0x8026D950; // type:function size:0x28 checkIsClear__9dAcTbox_cCFv = .text:0x8026D980; // type:function size:0x140 fn_8026DAC0__9dAcTbox_cFR4mAng = .text:0x8026DAC0; // type:function size:0x10 fn_8026DAD0__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DAD0; // type:function size:0x8 -getCylParams__9dAcTbox_cFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C -fn_8026DD70__9dAcTbox_cFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC +getCylParams__9dAcTbox_cCFP7mVec3_cPfPf = .text:0x8026DAE0; // type:function size:0x28C +getCCBounds__9dAcTbox_cCFP7mVec3_cP7mVec3_c = .text:0x8026DD70; // type:function size:0x2DC getInteractionTargetDef__9dAcTbox_cCFv = .text:0x8026E050; // type:function size:0x40 fn_8026E090__9dAcTbox_cFv = .text:0x8026E090; // type:function size:0x594 fn_8026E630__9dAcTbox_cFv = .text:0x8026E630; // type:function size:0x10C diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 946d0ca4..90afd1dc 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -9,6 +9,7 @@ #include "toBeSorted/tlist.h" class dAcBase_c; +struct cBgS_PolyInfo; struct SoundSource { // TODO @@ -255,7 +256,7 @@ public: /* 8002dd50 */ void FUN_8002dd50(); /* 8002dd90 */ void FUN_8002dd90(); /* 8002ddd0 */ void FUN_8002ddd0(); - /* 8002de30 */ void FUN_8002de30(); + /* 8002de30 */ void FUN_8002de30(cBgS_PolyInfo &p); public: /* 80571920 */ static u32 s_Create_RoomId; diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 139a511a..8c3ea526 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -51,6 +51,8 @@ public: void setTransform(const mMtx_c &mtx, UNKWORD, UNKWORD, UNKWORD); void setPosYRot(const mVec3_c &pos, mAng rot, UNKWORD, UNKWORD, UNKWORD); + // argument is always false in existing code, true doesn't seem to make a difference + void bonk(bool unk = false); /* vt 0x080 */ virtual UNKWORD IfCurrentActionToActor(dAcBase_c *ac, UNKWORD); /* vt 0x084 */ virtual void vt_0x084(dAcBase_c *ac, UNKWORD); diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 015fb613..f621a13a 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -116,13 +116,13 @@ private: void noUnregisterDowsing(); static bool fn_80268660(int arg); - void fn_8026E090(); + bool checkForLinkBonk(); void fn_8026E630(); bool fn_8026D540(); bool fn_8026D3C0(); void syncScaleToMdl(m3d::scnLeaf_c *lf); - void fn_8026DD70(mVec3_c *out1, mVec3_c *out2); - void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3); + void getCCBounds(mVec3_c *out1, mVec3_c *out2) const; + void getCylParams(mVec3_c *out1, f32 *out2, f32 *out3) const; void fn_8026DAD0(mVec3_c *src, mVec3_c *dest) const; void fn_8026DAC0(mAng& ang); diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index b60fbedb..600ae9c3 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -613,6 +613,6 @@ void dAcBase_c::FUN_8002dd90() { void dAcBase_c::FUN_8002ddd0() {} // 8002de30 -void dAcBase_c::FUN_8002de30() { +void dAcBase_c::FUN_8002de30(cBgS_PolyInfo &p) { FUN_8002ddd0(); } diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 203258e1..c7190f00 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -6,6 +6,8 @@ #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/c/c_bg_s_poly_info.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/flag/sceneflag_manager.h" @@ -19,6 +21,7 @@ #include "nw4r/g3d/g3d_resanmtexsrt.h" #include "nw4r/g3d/g3d_resfile.h" #include "nw4r/g3d/g3d_resmdl.h" +#include "rvl/MTX/mtxvec.h" #include "s/s_Math.h" #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/attention.h" @@ -911,7 +914,7 @@ int dAcTbox_c::create() { if (mItemId > MAX_ITEM_ID) { return FAILED; } - mVariant = sItemToTBoxVariant[mItemId]; + mVariant = (TboxVariant_e)sItemToTBoxVariant[mItemId]; if (mVariant == GODDESS) { setItemId((ITEM_ID)(MAX_ITEM_ID - mItemId)); } @@ -1147,7 +1150,7 @@ int dAcTbox_c::actorExecute() { return SUCCEEDED; } - fn_8026E090(); + checkForLinkBonk(); fn_8026E630(); mStateMgr.executeState(); if (fn_8026D540()) { @@ -1160,7 +1163,7 @@ int dAcTbox_c::actorExecute() { mMdl1.getModel().calc(false); if ((field_0x11F4 & 2) != 0) { mVec3_c v1, v2; - fn_8026DD70(&v1, &v2); + getCCBounds(&v1, &v2); v1 *= field_0x11E8; v2 *= field_0x11E8; mCcD3.Set(v1, v2); @@ -1283,7 +1286,7 @@ int dAcTbox_c::actorExecuteInEvent() { return SUCCEEDED; } - fn_8026E090(); + checkForLinkBonk(); fn_8026E630(); switch (mEvent.getCurrentEventCommand()) { @@ -1346,7 +1349,7 @@ int dAcTbox_c::actorExecuteInEvent() { mMdl1.getModel().calc(false); if ((field_0x11F4 & 2) != 0) { mVec3_c v1, v2; - fn_8026DD70(&v1, &v2); + getCCBounds(&v1, &v2); v1 *= field_0x11E8; v2 *= field_0x11E8; mCcD3.Set(v1, v2); @@ -2017,6 +2020,177 @@ bool dAcTbox_c::checkIsClear() const { return isClear; } +void dAcTbox_c::getCylParams(mVec3_c *c, f32 *r, f32 *h) const { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 70.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -24.0f); + } + if (r != nullptr) { + *r = 86.0f; + } + if (h != nullptr) { + *h = 140.0f; + } + break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 48.0f; + } + if (h != nullptr) { + *h = 68.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -14.0f); + } + if (r != nullptr) { + *r = 60.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 100.0f; + } + if (h != nullptr) { + *h = 132.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -44.0f); + } + if (r != nullptr) { + *r = 122.0f; + } + if (h != nullptr) { + *h = 160.0f; + } + break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: + if (c != nullptr) { + c->set(0.0f, 0.0f, 0.0f); + } + if (r != nullptr) { + *r = 73.0f; + } + if (h != nullptr) { + *h = 100.0f; + } + break; + case 1: + if (c != nullptr) { + c->set(0.0f, 0.0f, -23.0f); + } + if (r != nullptr) { + *r = 88.0f; + } + if (h != nullptr) { + *h = 140.0f; + } + break; + } + break; + } + if (c != nullptr) { + PSMTXMultVec(mWorldMtx, *c, *c); + } +} + +void dAcTbox_c::getCCBounds(mVec3_c *lo, mVec3_c *up) const { + if (lo != nullptr) { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: lo->set(-61.0f, 0.0f, -42.0f); break; + case 1: lo->set(-61.0f, 0.0f, -90.0f); break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: lo->set(-38.0f, 0.0f, -35.0f); break; + case 1: lo->set(-38.0f, 0.0f, -68.0f); break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: lo->set(-90.0f, 0.0f, -53.0f); break; + case 1: lo->set(-90.0f, 0.0f, -135.0f); break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: lo->set(-62.0f, 0.0f, -47.0f); break; + case 1: lo->set(-62.0f, 0.0f, -95.0f); break; + } + break; + } + } + if (up != nullptr) { + switch ((u32)mVariant) { + case NORMAL: + switch (field_0x120C) { + case 0: up->set(61.0f, 100.0f, 42.0f); break; + case 1: up->set(61.0f, 142.0f, 42.0f); break; + } + break; + case SMALL: + switch (field_0x120C) { + case 0: up->set(38.0f, 68.0f, 35.0f); break; + case 1: up->set(38.0f, 101.0f, 31.0f); break; + } + break; + case BOSS: + switch (field_0x120C) { + case 0: up->set(90.0f, 133.0f, 56.0f); break; + case 1: up->set(90.0f, 163.0f, 56.0f); break; + } + break; + case GODDESS: + switch (field_0x120C) { + case 0: up->set(62.0f, 100.0f, 47.0f); break; + case 1: up->set(62.0f, 140.0f, 47.0f); break; + } + break; + } + } +} + const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { switch ((u32)mVariant) { case NORMAL: @@ -2042,3 +2216,63 @@ const InteractionTargetDef &dAcTbox_c::getInteractionTargetDef() const { } } } + +bool dAcTbox_c::checkForLinkBonk() { + if (!mCcD4.ChkCoHit()) { + return false; + } + dAcPy_c *link = dAcPy_c::LINK; + if (link == nullptr) { + return false; + } + if (link->getCurrentAction() != /* ROLL */ 12) { + return false; + } + + mVec3_c linkPos; + PSMTXMultVec(mCcD3.mInvMtx, link->position, linkPos); + mVec3_c ccLo, ccHi; + getCCBounds(&ccLo, &ccHi); + // Math performed in local coordinate space + // All of this is wrong + if (!(ccLo.y <= linkPos.y + 100.0f && linkPos.y <= ccHi.y)) { + return false; + } + + bool bonk = false; + bonk = bonk || (ccLo.x <= linkPos.x && linkPos.x <= ccHi.x) && + (ccLo.z - 80.0f <= linkPos.z && linkPos.z <= ccHi.z + 80.0f); + bonk = bonk || (ccLo.z <= linkPos.z && linkPos.z <= ccHi.z) && + (ccLo.x - 80.0f <= linkPos.x && linkPos.x <= ccHi.x + 80.0f); + bonk = bonk || (linkPos.x < ccLo.x && linkPos.z < ccLo.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (ccHi.x < linkPos.x && ccHi.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (linkPos.x < ccLo.x && ccLo.z < linkPos.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + bonk = bonk || (ccHi.x < linkPos.x && linkPos.z < ccHi.z) && (linkPos.inprodXZ(ccLo) <= 6400.0f); + + if (!bonk) { + return false; + } + + int direction = 0; + mVec3_c diff = mVec3_c(linkPos.x - mCcD3.mField_0xA8.x, 0.0f, linkPos.z - mCcD3.mField_0xA8.z); + if (VEC3LenSq(diff) <= FLT_EPSILON) { + return false; + } + + // TODO + + link->bonk(); + + return false; +} + +void dAcTbox_c::fn_8026E630() { + mVec3_c offset = mVec3_c::Ey * 10.0f; + mVec3_c checkPos = position + offset; + // TODO reference vs pointer + if (dBgS_ObjGndChk::CheckPos(checkPos) && &dBgS_ObjGndChk::GetInstance()) { + cBgS_PolyInfo p = dBgS_ObjGndChk::GetInstance(); + dBgS::GetInstance()->SetLightingCode(this, p); + FUN_8002de30(p); + } +}