diff options
| author | robojumper <robojumper@gmail.com> | 2024-06-09 00:07:28 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2024-06-09 00:07:28 +0200 |
| commit | 4e77023d7bba2fb0a1eebd7d5131c89800f0ccee (patch) | |
| tree | ef53dd317586b18b2179daba98cc29d7adeda49a /src | |
| parent | fda931e2aead6b77c099f0e09d34ebd17c2d238c (diff) | |
Basically give up on d_t_sound_area
Diffstat (limited to 'src')
| -rw-r--r-- | src/REL/d/t/d_t_sound_area.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/src/REL/d/t/d_t_sound_area.cpp b/src/REL/d/t/d_t_sound_area.cpp index e69de29b..fd625825 100644 --- a/src/REL/d/t/d_t_sound_area.cpp +++ b/src/REL/d/t/d_t_sound_area.cpp @@ -0,0 +1,128 @@ +#include <d/a/obj/d_a_obj_base.h> +#include <d/d_player.h> +#include <d/tg/d_t_sound_area.h> +#include <rvl/MTX.h> + +SPECIAL_ACTOR_PROFILE(TAG_SOUND_AREA, dTgSndAr_c, fProfile::TAG_SOUND_AREA, 0x0146, 0, 0); + +struct SoundAreaManager { + u8 unk[0xFC]; + u32 bgmFlags; +}; + +extern SoundAreaManager *lbl_805756EC; + +int dTgSndAr_c::create() { + scale *= 0.01f; + if (lbl_805756EC == nullptr) { + dAcObjBase_c::createActorUnkGroup3(fProfile::SOUND_AREA_MGR, roomid, 0, nullptr, nullptr, nullptr, -1); + } + + switch (getTypeFromParams()) { + case 0: + PSMTXTrans(mtx.m, position.x, position.y, position.z); + mtx.YrotM(rotation.y); + PSMTXInverse(mtx.m, mtx.m); + break; + case 3: + mRail.init(params >> 8 & 0xFF, roomid, 0); + break; + } + + fBase_c *base = nullptr; + while (true) { + if ((base = fManager_c::searchBaseByGroupType(ACTOR, base)) == nullptr) { + break; + } + // This has got to be just a member function + dAcBase_c *ac = static_cast<dAcBase_c *>(base); + if (!dBase_c::isActorPlayer(*ac) && checkPosInArea(ac->position)) { + ac->setBit_field_0xE8(params & 0xFF); + } + } + return 1; +} + +int dTgSndAr_c::doDelete() { + return 1; +} + +struct Unk { + u8 unk[0x144]; + f32 x; + f32 y; + f32 z; +}; + +extern Unk *lbl_80575D58; + +int dTgSndAr_c::actorExecute() { + dAcBase_c *link = dPlayer::LINK; + if (link != nullptr && checkPosInArea(link->position)) { + link->setBit_field_0xE8(params & 0xFF); + } + if (lbl_80575D58 != nullptr) { + // Halp + mVec3_c pos(lbl_80575D58->x, lbl_80575D58->y, lbl_80575D58->z); + if (checkPosInArea(pos) && lbl_805756EC != nullptr) { + lbl_805756EC->bgmFlags |= 1 << (params & 0xFF); + } + } + return 1; +} + +int dTgSndAr_c::draw() { + return 1; +} + +bool dTgSndAr_c::checkPosInArea(mVec3_c &pos) { + switch (getTypeFromParams()) { + case 0: + return checkAlg0(pos); + case 1: + return checkAlg1(pos); + case 2: + return checkAlg2(pos); + case 3: + return checkAlg3(pos); + } + + return false; +} + +// Box +bool dTgSndAr_c::checkAlg0(mVec3_c &pos) { + mVec3_c c2 = pos; + PSMTXMultVec(mtx.m, c2, c2); + f32 scaleX = scale.x; + f32 scaleZ = scale.z; + if (c2.x >= scaleX * -50.0f && c2.x <= scaleX * 50.0f && c2.y >= 0.0f && c2.y <= scale.y * 100.0f && + c2.z >= scaleZ * -50.0f && c2.z <= scaleZ * 50.0f) { + return true; + } + + return false; +} + +// Sphere +bool dTgSndAr_c::checkAlg1(mVec3_c &pos) { + f32 tgtDist = scale.x * 100.0f; + f32 tgtDist2 = tgtDist * tgtDist; + return PSVECSquareDistance(position, pos) < tgtDist2; +} + +// Cylinder +bool dTgSndAr_c::checkAlg2(mVec3_c &pos) { + f32 f3 = position.x; + if (pos.y < f3 || (f3 + scale.y * 100.0f < pos.y)) { + return false; + } + + f32 f1 = position.z; + f32 f2 = position.x; + f3 = scale.x * 100.0f; + return f2 * f2 + f1 * f1 <= f3 * f3; +} + +// ??? +bool dTgSndAr_c::checkAlg3(mVec3_c &pos) {} |
