diff options
| author | Aetias <144526980+AetiasHax@users.noreply.github.com> | 2025-07-31 21:22:55 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-31 21:22:55 +0200 |
| commit | 82f54b2f075e7f6612b80edf52b37bb6377e0d49 (patch) | |
| tree | 93550aa10732bc050088b5773ce3ea0d09f6e0dc /src | |
| parent | 8ad6359c7d3c7afcbddd7d450b7fa4b9764255b6 (diff) | |
EquipBombchu (#131)
* Map symbol in Game
* EquipBombchu 12%
* EquipBombchu 53%
* EquipBombchu 71%
* configure: Don't verify dsd version if `--dsd` specified
* EquipBombchu 89%
* Fix regression
Diffstat (limited to 'src')
27 files changed, 996 insertions, 242 deletions
diff --git a/src/00_Core/Actor/Actor.cpp b/src/00_Core/Actor/Actor.cpp index 47d5e3d6..c2a0f06c 100644 --- a/src/00_Core/Actor/Actor.cpp +++ b/src/00_Core/Actor/Actor.cpp @@ -15,6 +15,7 @@ extern "C" { #include "Player/PlayerLinkBase.hpp" #include "Player/TouchControl.hpp" #include "Save/AdventureFlags.hpp" +#include "Unknown/UnkStruct_ov000_020e9c88.hpp" static char *sShipTypes[] = {"brg", "anc", "bow", "hul", "can", "dco", "pdl", "fnl"}; @@ -491,7 +492,7 @@ ARM bool Actor::CollidesWithShield(Cylinder *param1) { Vec3p vecFromPlayer; Vec3p_Sub(&mPos, &gPlayerPos, &vecFromPlayer); s32 currAngle = gPlayerAngle; - s32 angle = Atan2(vecFromPlayer.x, vecFromPlayer.z); + s32 angle = FX_Atan2Idx(vecFromPlayer.x, vecFromPlayer.z); s32 angleDiff = (s16) angle - currAngle; if (angleDiff < 0) { angleDiff = -angleDiff; @@ -705,7 +706,7 @@ ARM s16 Actor::GetAngleTo(Vec3p *vec) { q20 dz = vec->z - mPos.z; q20 dx = vec->x - mPos.x; if (dx != 0 || dz != 0) { - angle = Atan2(dx, dz); + angle = FX_Atan2Idx(dx, dz); } return angle; } @@ -973,11 +974,9 @@ ARM void Actor::KillInBounds() { this->Kill(); } -extern unk32 data_ov00_020e9c88; -extern "C" void func_ov00_0207b89c(unk32 *param1, s32 param2, Vec3p *param3, void *param4, Actor *param5); void vfunc_ac_Thunk(Actor *actor); ARM void Actor::func_ov00_020c31c0(unk32 param1) { - func_ov00_0207b89c(&data_ov00_020e9c88, param1, &mPos, &vfunc_ac_Thunk, this); + data_ov000_020e9c88.func_ov000_0207b89c(param1, &mPos, (void (*)(void *)) &vfunc_ac_Thunk, this); } ARM void vfunc_ac_Thunk(Actor *actor) { diff --git a/src/00_Core/Actor/Navi/ActorNavi.cpp b/src/00_Core/Actor/Navi/ActorNavi.cpp index 41a2015a..dd93a77a 100644 --- a/src/00_Core/Actor/Navi/ActorNavi.cpp +++ b/src/00_Core/Actor/Navi/ActorNavi.cpp @@ -10,7 +10,7 @@ UnkStruct_ov000_020b8110::UnkStruct_ov000_020b8110() : UnkStruct_ov000_020b8110::~UnkStruct_ov000_020b8110() {} void UnkStruct_ov000_020b8110::vfunc_08(unk16 *param1) {} void UnkStruct_ov000_020b8110::vfunc_18(s32 *param1) {} -void UnkStruct_ov000_020b8110::vfunc_14(u16 *param1) {} +bool UnkStruct_ov000_020b8110::vfunc_14(u16 *param1) {} void ActorNavi::func_ov000_020b8200() {} void ActorNavi::vfunc_c4() {} void ActorNavi::vfunc_c8() {} diff --git a/src/00_Core/Item/ItemManager.cpp b/src/00_Core/Item/ItemManager.cpp index 9fed2bf7..c15eafe4 100644 --- a/src/00_Core/Item/ItemManager.cpp +++ b/src/00_Core/Item/ItemManager.cpp @@ -167,24 +167,24 @@ ARM ItemModel *ItemManager::GetItemModel(ItemModelId id) { return mItemModels[id];
}
-extern "C" void func_ov000_020c0bdc(unk32 param1, unk32 param2);
-ARM void ItemManager::func_ov00_020ad538(unk32 param1) const {
+extern "C" void *func_ov000_020c0bdc(unk32 param1, const ItemManager_Unk1 *param2);
+ARM void *ItemManager::func_ov00_020ad538(const ItemManager_Unk1 *param1) const {
unk32 unk1 = gItemModelLoader->func_ov000_020bb3a8(6);
- func_ov000_020c0bdc(unk1, param1);
+ return func_ov000_020c0bdc(unk1, param1);
}
-ARM void ItemManager::func_ov00_020ad560(unk32 param1) const {
+ARM void *ItemManager::func_ov00_020ad560(const ItemManager_Unk1 *param1) const {
unk32 unk1 = gItemModelLoader->func_ov000_020bb3a8(7);
- func_ov000_020c0bdc(unk1, param1);
+ return func_ov000_020c0bdc(unk1, param1);
}
ARM ItemModel *ItemManager::GetDungeonItemModel(u32 index) {
return mDungeonItemModels[index];
}
-ARM void ItemManager::func_ov00_020ad594(unk32 param1) const {
+ARM void *ItemManager::func_ov00_020ad594(const ItemManager_Unk1 *param1) const {
unk32 unk1 = gItemModelLoader->func_ov000_020bb3a8(11);
- func_ov000_020c0bdc(unk1, param1);
+ return func_ov000_020c0bdc(unk1, param1);
}
ARM void ItemManager::Sword_vfunc_38(unk32 param1) {
diff --git a/src/00_Core/Map/MapBase.cpp b/src/00_Core/Map/MapBase.cpp index 555024bc..b3a7122e 100644 --- a/src/00_Core/Map/MapBase.cpp +++ b/src/00_Core/Map/MapBase.cpp @@ -27,7 +27,7 @@ unk32 MapBase::vfunc_68(Vec3p *param_1, bool param_2) {} unk8 MapBase::func_ov00_0207e940(unk8 *param_1) {} unk8 MapBase::func_ov00_0207e968() {} unk8 MapBase::func_ov00_0207e96c() {} -unk8 MapBase::vfunc_6c(unk32 param_2, unk32 param_3, unk32 param_4) {} +unk8 MapBase::vfunc_6c(Vec3p *param_2, unk32 *param_3, Vec3p *param_4) {} unk32 MapBase::vfunc_70(Vec3p *param_2) {} unk32 *MapBase::vfunc_74(Vec3p *param_2) {} unk8 MapBase::func_ov00_0207f100() {} diff --git a/src/00_Core/Map/MapManager.cpp b/src/00_Core/Map/MapManager.cpp index f2c38569..71bcd9dc 100644 --- a/src/00_Core/Map/MapManager.cpp +++ b/src/00_Core/Map/MapManager.cpp @@ -1264,7 +1264,7 @@ ARM unk32 MapManager::func_ov00_02083f44(Vec3p *param_2, bool param_3) { return this->func_ov00_02083ef8(param_2, &local_18, param_3); } -unk8 MapManager::MapData_vfunc_6c(unk32 param_2, unk32 param_3, unk32 param_4) { +unk8 MapManager::MapData_vfunc_6c(Vec3p *param_2, unk32 *param_3, Vec3p *param_4) { this->mMap->vfunc_6c(param_2, param_3, param_4); } @@ -2503,7 +2503,7 @@ unk8 MapManager::func_ov00_02085c60(Vec3p *param_2, unk32 *param_3, unk32 *param Vec2p iStack_104; Vec3p VStack_f0; Vec3p VStack_e4; - Vec4p VStack_d8; + Sphere VStack_d8; Vec3p VStack_c8; Vec3p VStack_bc; Vec3p VStack_b0; @@ -2566,11 +2566,11 @@ unk8 MapManager::func_ov00_02085c60(Vec3p *param_2, unk32 *param_3, unk32 *param VStack_b0.z = VStack_bc.z; Vec3p_Add(&VStack_b0, &VStack_c8, &VStack_b0); } - bVar5 = false; - VStack_d8.y = param_5 << 1; - VStack_d8.x = 0; - VStack_d8.z = 0; - VStack_d8.w = param_5; + bVar5 = false; + VStack_d8.pos.y = param_5 << 1; + VStack_d8.pos.x = 0; + VStack_d8.pos.z = 0; + VStack_d8.radius = param_5; do { bVar4 = func_01ffbe78(param_2, &VStack_b0, &VStack_bc, &VStack_d8); if (bVar4) { diff --git a/src/00_Core/Player/EquipItem.cpp b/src/00_Core/Player/EquipItem.cpp index 8751b91d..1c51f48d 100644 --- a/src/00_Core/Player/EquipItem.cpp +++ b/src/00_Core/Player/EquipItem.cpp @@ -13,7 +13,7 @@ unk32 EquipItem::vfunc_48(unk32 param1) const {} s32 EquipItem::vfunc_4c() const {} Vec3p *EquipItem::GetPlayerPos() {} void EquipItem::func_ov000_020be99c(Vec3p *param1) {} -void EquipItem::func_ov000_020be9e4(s32 param1, s32 param2, s32 param3, s16 param4) {} +void EquipItem::func_ov000_020be9e4(Vec3p param3, s16 param4) {} s16 EquipItem::GetAmmo() const {} void EquipItem::GiveAmmo(u32 amount) {} bool EquipItem::GetHitbox(Cylinder *hitbox) const {} diff --git a/src/00_Core/Player/PlayerBase.cpp b/src/00_Core/Player/PlayerBase.cpp index 6f89f0d1..5edea52f 100644 --- a/src/00_Core/Player/PlayerBase.cpp +++ b/src/00_Core/Player/PlayerBase.cpp @@ -54,7 +54,7 @@ ARM void PlayerBase::LookAt(Vec3p *target) { if (vec.x == 0 && vec.z == 0) { return; } - gPlayerAngle = Atan2(*(vs32 *) &vec.x, vec.z); + gPlayerAngle = FX_Atan2Idx(*(vs32 *) &vec.x, vec.z); } ARM bool PlayerBase::func_ov00_020a7c00(s32 param1) { diff --git a/src/00_Core/Player/PlayerControl.cpp b/src/00_Core/Player/PlayerControl.cpp index 1e5f5d98..50c08bda 100644 --- a/src/00_Core/Player/PlayerControl.cpp +++ b/src/00_Core/Player/PlayerControl.cpp @@ -873,7 +873,7 @@ ARM bool PlayerControl::func_ov00_020b0b0c(s16 *pAngle, ItemFlag *pEquipId, unk3 *pAngle = mTouchAngle + ((s16) (mTouchFastAngle - mTouchAngle)) / 2; if (mTouchSpeed > FLOAT_TO_Q20(0.5)) { - q4 touchMoveAngle = Atan2(mTouchSpeedX, mTouchSpeedY) - *pAngle; + q4 touchMoveAngle = FX_Atan2Idx(mTouchSpeedX, mTouchSpeedY) - *pAngle; if (pFast != NULL) { *pFast = true; } @@ -881,7 +881,7 @@ ARM bool PlayerControl::func_ov00_020b0b0c(s16 *pAngle, ItemFlag *pEquipId, unk3 return true; } - s32 unkAngle = Atan2(local_20.x, local_20.z); + s32 unkAngle = FX_Atan2Idx(local_20.x, local_20.z); s32 unkAngle2 = (s16) ((s16) unkAngle - *pAngle); Vec3p VStack_2c = {INT_TO_Q20(mTouchFastX), INT_TO_Q20(mTouchFastY), 0}; diff --git a/src/00_Core/Render/ModelRender.cpp b/src/00_Core/Render/ModelRender.cpp index 03a66133..208ddb45 100644 --- a/src/00_Core/Render/ModelRender.cpp +++ b/src/00_Core/Render/ModelRender.cpp @@ -1,6 +1,6 @@ #include "Render/ModelRender.hpp" -ModelRender::ModelRender() {} +ModelRender::ModelRender(unk32 param1) {} ModelRender::~ModelRender() {} void *ModelRender::GetLcdcAddress() {} void ModelRender::vfunc_0c(ItemModel *model) {} @@ -10,7 +10,7 @@ void ModelRender::SetRotationTranslation(Mat3p *rotation, Vec3p *translation) {} void ModelRender::SetTranslation(Vec3p *translation) {} void ModelRender::PushGeometryCommands() {} void ModelRender::vfunc_20() {} -void ModelRender::vfunc_24(unk32 param1) {} +void ModelRender::vfunc_24(UnkStruct_ov000_020c0c08 *param1) {} void ModelRender::vfunc_28() {} void ModelRender::vfunc_2c() {} void ModelRender::vfunc_34() {} diff --git a/src/00_Core/Unknown/UnkStruct_ov000_020beba8.cpp b/src/00_Core/Unknown/UnkStruct_ov000_020beba8.cpp index 1d46c6b3..076ddcbf 100644 --- a/src/00_Core/Unknown/UnkStruct_ov000_020beba8.cpp +++ b/src/00_Core/Unknown/UnkStruct_ov000_020beba8.cpp @@ -1,9 +1,9 @@ #include "Unknown/UnkStruct_ov000_020beba8.hpp" UnkStruct_ov000_020beba8::UnkStruct_ov000_020beba8(unk32 param1) {} -void UnkStruct_ov000_020beba8::vfunc_08(unk16 *param1) {} +bool UnkStruct_ov000_020beba8::vfunc_08(UnkStruct_ov000_020beba8_08 *param1) {} void UnkStruct_ov000_020beba8::vfunc_0c(unk16 *param1) {} -void UnkStruct_ov000_020beba8::vfunc_10(s32 *param1) {} +bool UnkStruct_ov000_020beba8::vfunc_10(s32 *param1) {} void UnkStruct_ov000_020beba8::vfunc_18(s32 *param1) {} -void UnkStruct_ov000_020beba8::vfunc_14(u16 *param1) {} +bool UnkStruct_ov000_020beba8::vfunc_14(u16 *param1, s32 param2) {} UnkStruct_ov000_020beba8::~UnkStruct_ov000_020beba8() {} diff --git a/src/04_Load/Actor/Navi/ActorNavi.cpp b/src/04_Load/Actor/Navi/ActorNavi.cpp index 12939c04..ca1635f8 100644 --- a/src/04_Load/Actor/Navi/ActorNavi.cpp +++ b/src/04_Load/Actor/Navi/ActorNavi.cpp @@ -1,3 +1,6 @@ #include "Actor/Navi/ActorNavi.hpp" +#include "Item/ItemManager.hpp" -ActorNavi::ActorNavi() {} +ActorNavi::ActorNavi() : + mUnk_294(0), + mUnk_2f0(&mUnk_314, gItemManager->GetItemModel(ItemModelId_Hammer)) {} diff --git a/src/04_Load/Actor/Navi/ActorNaviBase.cpp b/src/04_Load/Actor/Navi/ActorNaviBase.cpp index 21d91459..2ad0dc0b 100644 --- a/src/04_Load/Actor/Navi/ActorNaviBase.cpp +++ b/src/04_Load/Actor/Navi/ActorNaviBase.cpp @@ -1,6 +1,7 @@ #include "Actor/Navi/ActorNaviBase.hpp" -ActorNaviBase::ActorNaviBase() {} +ActorNaviBase::ActorNaviBase() : + mUnk_168(0) {} ActorNaviBase::~ActorNaviBase() {} void func_ov004_021079d4(unk32 *param1) {} bool ActorNaviBase::Init() {} diff --git a/src/04_Load/Player/LinkStateDamage.cpp b/src/04_Load/Player/LinkStateDamage.cpp index 2eecae46..3f526599 100644 --- a/src/04_Load/Player/LinkStateDamage.cpp +++ b/src/04_Load/Player/LinkStateDamage.cpp @@ -1,6 +1,7 @@ #include "Player/LinkStateDamage.hpp" LinkStateDamage::LinkStateDamage(PlayerLinkBase *link) : - LinkStateBase(link) {} + LinkStateBase(link), + mUnk_3c(0) {} unk32 *_Z19func_ov004_021083f4Piiii(unk32 *param1, unk32 param2, unk32 param3, unk32 param4) {} LinkStateDamage::~LinkStateDamage() {} diff --git a/src/05/DTCM/UnkStruct_027e103c.cpp b/src/05/DTCM/UnkStruct_027e103c.cpp index 5e84fbe5..d3829d88 100644 --- a/src/05/DTCM/UnkStruct_027e103c.cpp +++ b/src/05/DTCM/UnkStruct_027e103c.cpp @@ -21,4 +21,4 @@ bool UnkStruct_027e103c::func_ov005_021040ec() {} void UnkStruct_027e103c::func_ov005_02104114() {} void UnkStruct_027e103c::func_ov005_0210413c() {} void UnkStruct_027e103c::func_ov005_02104160() {} -void UnkStruct_027e103c::func_Ov005_0210418c(char param1) {} +void UnkStruct_027e103c::func_ov005_0210418c(char param1) {} diff --git a/src/05/Player/LinkStateMove_05.cpp b/src/05/Player/LinkStateMove_05.cpp index 805685b3..043a05b7 100644 --- a/src/05/Player/LinkStateMove_05.cpp +++ b/src/05/Player/LinkStateMove_05.cpp @@ -227,7 +227,7 @@ ARM bool UnkFilterActor::Filter(Actor *actor) { Vec3p sp0; Vec3p_Sub(&actor->mPos, &mPos, &sp0); s16 angle2 = mAngle; - s16 angle1 = (s16) Atan2(sp0.x, sp0.z); + s16 angle1 = (s16) FX_Atan2Idx(sp0.x, sp0.z); s32 var_r6 = (s16) (angle1 - angle2) >> 3; if (var_r6 < 0) { var_r6 = -var_r6; diff --git a/src/14_Land/Actor/Player/ActorBlast.cpp b/src/14_Land/Actor/Player/ActorBlast.cpp index 06f82f63..64bea809 100644 --- a/src/14_Land/Actor/Player/ActorBlast.cpp +++ b/src/14_Land/Actor/Player/ActorBlast.cpp @@ -3,7 +3,7 @@ ActorType ActorBlast::gType = ActorType(ActorTypeId_Blast, (ActorCreateFunc) ActorBlast::Create, NULL); ActorBlast *ActorBlast::Create() {} -void ActorBlast_Unk1::vfunc_10(s32 *param1) {} +bool ActorBlast_Unk1::vfunc_10(s32 *param1) {} ActorBlast::ActorBlast() {} ActorBlast::~ActorBlast() {} bool ActorBlast::Init() {} diff --git a/src/14_Land/Actor/Player/ActorBomb.cpp b/src/14_Land/Actor/Player/ActorBomb.cpp index 91224f12..ce804b85 100644 --- a/src/14_Land/Actor/Player/ActorBomb.cpp +++ b/src/14_Land/Actor/Player/ActorBomb.cpp @@ -4,7 +4,7 @@ ActorType ActorBomb::gType = ActorType(ActorTypeId_Bomb, (ActorCreateFunc) Actor ActorBomb *ActorBomb::Create() {} void ActorBomb_Unk1::vfunc_0c(unk16 *param1) {} -void ActorBomb_Unk1::vfunc_10(s32 *param1) {} +bool ActorBomb_Unk1::vfunc_10(s32 *param1) {} ActorBomb::ActorBomb() {} ActorBomb_Unk2::~ActorBomb_Unk2() {} ActorBomb::~ActorBomb() {} diff --git a/src/14_Land/Player/EquipBombchu.cpp b/src/14_Land/Player/EquipBombchu.cpp index 5ebfe5b8..de5fdb6b 100644 --- a/src/14_Land/Player/EquipBombchu.cpp +++ b/src/14_Land/Player/EquipBombchu.cpp @@ -1,13 +1,12 @@ #include "Player/EquipBombchu.hpp" EquipBombchu::EquipBombchu() {} -EquipBombchu_Unk1::EquipBombchu_Unk1() {} EquipBombchu::~EquipBombchu() {} void EquipBombchu::func_ov014_0213eba4() {} void EquipBombchu::func_ov014_0213ec40() {} void EquipBombchu::func_ov014_0213ec64() {} ItemFlag EquipBombchu::GetId() const {} void EquipBombchu::vfunc_34(unk16 *param1) {} -Actor *EquipBombchu::func_ov014_0213ed74() {} +Actor *EquipBombchu::func_ov014_0213ed74() const {} void *EquipBombchu::func_ov014_0213ed94(s32 param1) {} void EquipBombchu::func_ov014_0213eda0() {} diff --git a/src/18_Overworld/Map/MapOverworld.cpp b/src/18_Overworld/Map/MapOverworld.cpp index de9b727e..9b892131 100644 --- a/src/18_Overworld/Map/MapOverworld.cpp +++ b/src/18_Overworld/Map/MapOverworld.cpp @@ -29,7 +29,7 @@ void MapOverworld::vfunc_b0(unk32 param_2, unk32 param_3) {} void MapOverworld::func_ov018_0215c650() {} void MapOverworld::func_ov018_0215c6ac() {} void MapOverworld::func_ov018_0215c6d0() {} -MapOverworld_Unk1::MapOverworld_Unk1(u32 param1, u8 *param2, unk32 param3) : +MapOverworld_Unk1::MapOverworld_Unk1(u32 param1, ItemModel *param2, unk32 param3) : UnkStruct_ov000_020c0c08(0, param2) {} void MapOverworld::func_ov018_0215c9ac() {} void func_ov018_0215ca24(s32 param1) {} diff --git a/src/54_Scoop/Player/EquipScoop.cpp b/src/54_Scoop/Player/EquipScoop.cpp index ba34e890..5c30cc39 100644 --- a/src/54_Scoop/Player/EquipScoop.cpp +++ b/src/54_Scoop/Player/EquipScoop.cpp @@ -1,7 +1,7 @@ #include "Player/EquipScoop.hpp" #include "Player/LinkStateItem.hpp" -ModelRender EquipScoop::gModelRender; +ModelRender EquipScoop::gModelRender(0); void EquipScoop::vfunc_00() {} void EquipScoop::vfunc_18() {} diff --git a/src/55_Bomb/Player/EquipBomb.cpp b/src/55_Bomb/Player/EquipBomb.cpp index fcfb30c6..e51972c1 100644 --- a/src/55_Bomb/Player/EquipBomb.cpp +++ b/src/55_Bomb/Player/EquipBomb.cpp @@ -1,7 +1,7 @@ #include "Player/EquipBomb.hpp" #include "Player/LinkStateItem.hpp" -ModelRender EquipBomb::gModelRender; +ModelRender EquipBomb::gModelRender(0); void EquipBomb::vfunc_00() {} bool EquipBomb::IsUsable(unk32 param1) const {} diff --git a/src/56_Bow/Player/EquipBow.cpp b/src/56_Bow/Player/EquipBow.cpp index 8cb51602..8310f781 100644 --- a/src/56_Bow/Player/EquipBow.cpp +++ b/src/56_Bow/Player/EquipBow.cpp @@ -1,8 +1,8 @@ #include "Player/EquipBow.hpp" #include "Player/LinkStateItem.hpp" -ModelRender EquipBow::gModelRenderBow; -ModelRender EquipBow::gModelRenderArrow; +ModelRender EquipBow::gModelRenderBow(0); +ModelRender EquipBow::gModelRenderArrow(0); void EquipBow::vfunc_00() {} bool EquipBow::IsUsable(unk32 param1) const {} diff --git a/src/57_Rope/Actor/Player/ActorRope.cpp b/src/57_Rope/Actor/Player/ActorRope.cpp index 40ab1aa4..bbcf4115 100644 --- a/src/57_Rope/Actor/Player/ActorRope.cpp +++ b/src/57_Rope/Actor/Player/ActorRope.cpp @@ -3,7 +3,7 @@ ActorRope_Unk_0219a3b0 gUnk_0219a3b0; void ActorRope_Unk_0219a3b0::vfunc_08(unk16 *param1) {} -void ActorRope_Unk_0219a3b0::vfunc_10(s32 *param1) {} +bool ActorRope_Unk_0219a3b0::vfunc_10(s32 *param1) {} ActorRope::ActorRope() {} bool ActorRope::Init() {} q20 ActorRope::func_ov057_0219a5ac() {} diff --git a/src/58_Bombchu/Player/EquipBombchu.cpp b/src/58_Bombchu/Player/EquipBombchu.cpp index 7e6c0742..68ee77a1 100644 --- a/src/58_Bombchu/Player/EquipBombchu.cpp +++ b/src/58_Bombchu/Player/EquipBombchu.cpp @@ -1,33 +1,884 @@ #include "Player/EquipBombchu.hpp" +#include "Actor/ActorSpawner.hpp" +#include "DTCM/UnkStruct_027e077c.hpp" +#include "DTCM/UnkStruct_027e0c54.hpp" +#include "DTCM/UnkStruct_027e0de4.hpp" +#include "DTCM/UnkStruct_027e0f6c.hpp" +#include "DTCM/UnkStruct_027e0fd4.hpp" +#include "DTCM/UnkStruct_027e103c.hpp" +#include "Map/MapManager.hpp" #include "Player/LinkStateItem.hpp" +#include "Player/PlayerControl.hpp" +#include "Unknown/UnkStruct_020e9360.hpp" +#include "Unknown/UnkStruct_ov000_020c0c08.hpp" +#include "Unknown/UnkStruct_ov000_020e9c88.hpp" -ModelRender EquipBombchu::gModelRenderBombchu; -ModelRender EquipBombchu::gModelRenderBombchuPt; -EquipBombchu_Unk_02198d00 sUnk_02198d00; - -void EquipBombchu_Unk_02198d00::vfunc_08(unk16 *param1) {} -void func_ov058_02198ef4() {} -void func_ov058_02198ef8() {} -void EquipBombchu_Unk_02198d00::vfunc_14(u16 *param1) {} -void EquipBombchu_Unk_02198d00::vfunc_10(s32 *param1) {} -void EquipBombchu::vfunc_00() {} -void EquipBombchu::vfunc_18() {} -void EquipBombchu::vfunc_1c() {} -void EquipBombchu::vfunc_30() {} -void EquipBombchu::vfunc_38(unk32 param1) {} -void EquipBombchu::func_ov058_02199220() {} -void EquipBombchu::func_ov058_02199228() {} -void EquipBombchu::func_ov058_02199264() {} -void EquipBombchu::func_ov058_0219926c() {} -bool EquipBombchu::IsUsable(unk32 param1) const {} -bool EquipBombchu::CheckUsable(unk32 param1) const {} -Actor *EquipBombchu::func_ov058_02199400() {} -bool EquipBombchu::func_ov058_02199498(Vec3p *vec) {} -void EquipBombchu::func_ov058_02199ef0(unk16 param1) {} -void EquipBombchu::func_ov058_02199fd8(u32 param1) {} -unk32 EquipBombchu::func_ov058_0219a084(unk16 param1) {} -bool EquipBombchu::func_ov058_0219a3b4(unk16 param1) {} -EquipBombchu_Unk_02198d00::~EquipBombchu_Unk_02198d00() {} -void LinkStateItem::func_ov058_0219a454() {} -void LinkStateItem::func_ov058_0219a47c() {} -EquipBombchu *GetEquipBombchu() {} +static char *sShipParts[8] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"}; + +ARM bool EquipBombchu_Unk_02198d00::vfunc_08(UnkStruct_ov000_020beba8_08 *param1) { + Vec3p sp14 = {param1->mUnk_04.x, param1->mUnk_04.y, param1->mUnk_04.z}; + UnkStruct_027e0f6c_20 sp38; + s32 temp_r1 = param1->mUnk_00; + UnkStruct_027e0f6c_20 *temp_r2 = data_027e0f6c->mUnk_20; + sp38 = *(temp_r2 + temp_r1); + + Vec3p sp8 = {sp38.mUnk_08.x, sp38.mUnk_08.y, sp38.mUnk_08.z}; + Vec3p_Normalize(&sp8, &sp8); + Vec3p_Scale(&sp8, -0x400); + Vec3p_Add(&sp14, &sp8, &sp14); + MapManager *pMapManager = gMapManager; + TilePos sp4 = pMapManager->func_ov00_02083a1c(&sp14); + if ((pMapManager->func_ov00_020840dc(&sp4) == 0x46) && (gMapManager->func_ov00_02083f44(&sp14, 0) <= (sp14.y + 0x17FF))) { + return 0; + } + return this->func_ov014_02124034(param1); +} + +static unk32 data_ov058_0219aee0 = -1; + +ModelRender EquipBombchu::gModelRenderBombchu(0); +ModelRender EquipBombchu::gModelRenderBombchuPt(0); +static unk16 data_ov058_0219b090; +extern UnkStruct_ov000_020c0c08_04 data_ov058_0219b0c4; +static UnkStruct_ov000_020c0c08 data_ov058_0219b0a0(&data_ov058_0219b0c4, 0); +static UnkStruct_ov000_020c0c08_04 data_ov058_0219b0c4; +static EquipBombchu_Unk_02198d00 sUnk_02198d00; +static TilePos data_ov058_0219b110; + +ARM UnkStruct_027e0f6c_Unk_1::~UnkStruct_027e0f6c_Unk_1() {} + +ARM UnkStruct_027e0f6c_Unk_1::UnkStruct_027e0f6c_Unk_1() {} + +struct UnkStruct1 { + /* 00 */ unk8 mUnk_00[0xc]; + /* 0c */ Vec3p mUnk_0c; + /* 18 */ + + UnkStruct1(Vec3p vec) : + mUnk_0c(vec) {} +}; + +ARM bool EquipBombchu_Unk_02198d00::vfunc_14(u16 *param1, s32 param2) { + Actor *temp_r0 = gActorManager->FindActorById(param2); + if ((temp_r0 != NULL) && (temp_r0->mType == ActorTypeId_PWBS)) { + mUnk_10.y = 1; + UnkStruct1 unk(*(Vec3p *) ((u32) temp_r0 + 0x820)); + mUnk_14 = unk.mUnk_0c; + } + return true; +} + +ARM bool EquipBombchu_Unk_02198d00::vfunc_10(s32 *param1) { + Actor *temp_r0 = (Actor *) param1; + if (!temp_r0->SetUnk_11b()) { + return false; + } + bool result; + if ((*(s32 *) ((s32) param1 + 4) & 0x800) == 0) { + return false; + } + sUnk_02198d00.mUnk_10 = true; + return false; +} + +static const ItemManager_Unk1 sEquipBombchu_Unk1 = { + .mUnk_00 = "bomchu_pt", + .mUnk_10 = {0, 100}, +}; + +THUMB void EquipBombchu::vfunc_00() { + gModelRenderBombchu.vfunc_0c(gItemManager->GetItemModel(ItemModelId_Bombchu)); + gModelRenderBombchuPt.vfunc_0c(gItemManager->GetItemModel(ItemModelId_BombchuPt)); + data_ov058_0219b0a0.mUnk_08 = gItemManager->GetItemModel(ItemModelId_BombchuPt); + data_ov058_0219b0a0.func_ov000_020c0c44(gItemManager->func_ov00_020ad538(&sEquipBombchu_Unk1)); + data_ov058_0219b0a0.func_ov000_020c0e5c(0); + gModelRenderBombchuPt.vfunc_24(&data_ov058_0219b0a0); + data_ov058_0219b090 = 2; +} + +THUMB void EquipBombchu::vfunc_18() { + this->UpdateInUse(1); + mBombchuRef.Reset(); + this->func_ov014_0213eda0(); + this->func_ov014_0213ec64(); +} + +THUMB void EquipBombchu::vfunc_1c() { + data_ov058_0219b090 = 2; +} + +THUMB void EquipBombchu::vfunc_30() { + mUnk_44 += 1; + if ((gPlayerControl->IsUntouchedNow() || !mUnk_47) && !mUnk_48 && mUnk_18 > 0) { + data_027e103c->func_ov005_0210418c(1); + mUnk_48 = true; + } + if (mUnk_18 <= 0) { + return; + } + + data_ov058_0219b0a0.func_ov000_020c0e04(); + if (data_027e077c.mUnk_0 != 0xd) { + return; + } + + Vec3p local_18 = mUnk_2c; + Vec3p_Sub(&local_18, &mUnk_20, &local_18); + q20 length = Vec3p_Length(&local_18); + if (length < FLOAT_TO_Q20(0.2)) { + mUnk_20 = mUnk_2c; + } else if (Vec3p_TryNormalize(&local_18)) { + if (length < FLOAT_TO_Q20(1.0)) { + Vec3p_Scale(&local_18, FLOAT_TO_Q20(0.2)); + } else { + Vec3p_Scale(&local_18, FX_Mul(length, FLOAT_TO_Q20(0.2))); + } + Vec3p_Add(&mUnk_20, &local_18, &mUnk_20); + } else { + mUnk_20 = mUnk_2c; + } + gPlayerLink->func_ov000_020bb810(&mUnk_20, 0x800); +} + +void func_ov058_02199220(EquipBombchu *bombchu); +void func_ov058_02199264(EquipBombchu *bombchu); + +THUMB void EquipBombchu::vfunc_38(unk32 param1) { + if (this->IsInUse()) { + Vec3p VStack_1c; + this->func_ov000_020be99c(&VStack_1c); + VStack_1c.y += FLOAT_TO_Q20(0.7); + gModelRenderBombchu.func_ov000_020b413c(mUnk_04, &VStack_1c); + if ((mUnk_14 == 1) && (mUnk_18 > 0)) { + data_ov000_020e9c88.func_ov000_0207b89c(param1, &mUnk_20, (void (*)(void *)) &func_ov058_02199220, this); + } + } else { + if (this->CheckUsable(1)) { + if (data_ov058_0219b090 > 0) { + data_ov058_0219b090 -= 1; + } + } else { + data_ov058_0219b090 = 2; + } + } + if (mUnk_46 && data_027e077c.mUnk_0 == 0xd) { + data_027e0de4.func_ov000_0207bb1c(5, (void (*)(void *)) &func_ov058_02199264, this); + } + return; +} + +THUMB void func_ov058_02199220(EquipBombchu *bombchu) { + bombchu->func_ov058_02199228(); +} + +extern "C" void func_020197bc(void *param1, unk32 param2); +extern "C" void func_0201987c(void *param1, unk32 param2); +THUMB void EquipBombchu::func_ov058_02199228() { + unk32 uVar1 = data_ov000_020e9360.func_ov000_02079e68(2); + void *pvVar2 = gModelRenderBombchuPt.GetLcdcAddress(); + func_020197bc(pvVar2, uVar1); + pvVar2 = gModelRenderBombchuPt.GetLcdcAddress(); + func_0201987c(pvVar2, 1); + gModelRenderBombchuPt.SetTranslation(&mUnk_20); +} + +THUMB void func_ov058_02199264(EquipBombchu *bombchu) { + bombchu->func_ov058_0219926c(); +} + +THUMB void EquipBombchu::func_ov058_0219926c() { + this->func_ov000_020be9e4(mUnk_38, mUnk_44); +} + +ARM bool EquipBombchu::IsUsable(unk32 param1) const { + if (!this->CheckUsable(param1)) { + return false; + } + if ((param1 != 0) && (data_ov058_0219b090 > 0)) { + return false; + } + return true; +} + +extern "C" unk32 func_ov014_0212505c(); +ARM bool EquipBombchu::CheckUsable(unk32 param1) const { + if (!gMapManager->func_ov00_0208499c() || data_027e0c54.mUnk_0 || data_027e0d38->mUnk_0c.func_ov000_020a5e9c() == 0x33) { + return false; + } + if (data_027e0fd4->mUnk_05a != 0) { + return false; + } + if (this->GetAmmo() <= 0) { + return false; + } + if (param1 != 0) { + if (!gPlayerLink->func_ov000_020bba28()) { + return false; + } + switch (data_027e077c.mUnk_0) { + case 0x1: + case 0xb: + case 0xc: + case 0xd: + case 0x33: + case 0x34: + return this->func_ov014_0213ed74() == NULL || func_ov014_0212505c() != 0; + } + return false; + } + return true; +} + +THUMB Actor *EquipBombchu::func_ov058_02199400() { + if (this->EquipItem::GetAmmo() <= 0 || mUnk_18 <= 0) { + return NULL; + } + Vec3p *playerPos = EquipItem::GetPlayerPos(); + Vec3p spawnPos = *playerPos; + spawnPos.y += FLOAT_TO_Q20(0.5); + ActorSpawnOptions options; + options.mUnk_1c.id = 1; + options.mAngle = mUnk_04; + gActorSpawner->Spawn(ActorTypeId_Bombchu, &spawnPos, &options, &mBombchuRef); + Actor *iVar3 = this->func_ov014_0213ed74(); + if (iVar3 != NULL) { + this->GiveAmmo(-1); + } + this->UpdateInUse(0); + return iVar3; +} + +extern "C" void func_ov014_02124ff4(Sphere *sphere); +extern "C" bool func_0202b2f8(Vec3p *param_1, Vec3p *param_2, unk32 param_3); +THUMB bool EquipBombchu::func_ov058_02199498(Vec3p *vec) { + struct TempStruct1 { + /* 00 */ unk8 mUnk_00[0xe]; + /* 0e */ unk8 mUnk_0e; + /* 0f */ unk8 mUnk_0f; + /* 10 */ unk8 mUnk_10; + /* 11 */ unk8 mUnk_11; + /* 12 */ unk8 mUnk_12[0x6]; + /* 18 */ volatile unk8 mUnk_18; + /* 19 */ unk8 mUnk_19; + /* 1a */ unk8 mUnk_1a; + /* 1b */ unk8 mUnk_1b; + /* 1c */ unk8 mUnk_1c; + /* 1d */ unk8 mUnk_1d; + /* 1e */ + }; + + struct TempStruct2 { + union { + /* 00 */ Vec3p mUnk_00; + struct { + /* 00 */ u16 mUnk_00_x; + /* 02 */ u16 mUnk_02; + /* 04 */ u16 mUnk_04; + /* 06 */ u16 mUnk_06; + /* 08 */ unk32 mUnk_08; + }; + }; + /* 0c */ unk8 mUnk_0c[0x34]; + /* 40 */ + }; + + TempStruct1 sp214; + TempStruct2 sp1D4; + AABB sp1BC; + Vec3p sp1B0; + Vec3p sp1A4; + Sphere sp194; + Vec3p sp188; + Vec3p sp17C; + Vec3p sp170; + Vec3p sp164; + Vec3p sp158; + Vec3p sp14C; + Vec3p sp140; + Vec3p sp134; + Vec3p sp128; + Vec3p sp11C; + Vec3p sp110; + Vec3p sp104; + Vec3p spF8; + Vec3p spEC; + Vec3p spE0; + Vec3p spD4; + Vec3p spBC; + Vec3p spB0; + Vec3p spA4; + Vec3p sp98; + Vec3p sp8C; + Vec3p sp80; + Vec3p sp74; + unk32 sp64; + u32 sp60; + u32 sp5C; + unk32 sp50; + unk32 sp48; + unk32 sp44; + s32 sp20; + s32 sp1C; + s32 sp18; + s32 sp14; + s32 temp_r0_13; + s32 temp_r0_16; + s32 temp_r0_21; + s32 temp_r0_22; + s32 temp_r0_23; + s32 temp_r0_24; + s32 temp_r0_25; + s32 temp_r0_27; + s32 temp_r0_3; + s32 temp_r0_4; + s32 temp_r0_5; + s32 temp_r0_6; + s32 temp_r0_7; + s32 temp_r0_8; + s32 temp_r0_9; + s32 temp_r1; + s32 temp_r1_10; + s32 temp_r1_14; + s32 temp_r1_2; + s32 temp_r1_3; + s32 temp_r7_2; + s32 temp_r7_3; + s32 var_r0; + s32 var_r0_2; + s32 var_r1; + s32 var_r1_2; + s32 var_r1_3; + s32 var_r6; + s32 var_r6_2; + s32 var_r6_3; + s32 var_r7; + + data_ov058_0219aee0 = -1; + if ((mUnk_18 >= 0x64) || (!mUnk_47)) { + return 0; + } + gMapManager->func_ov00_0208346c(&sp1BC); + sp128.x = vec->x; + sp128.y = vec->y; + sp128.z = vec->z; + if (!sp1BC.Contains(&sp128)) { + var_r0 = 1; + } else { + var_r0 = 0; + } + if (var_r0 != 0) { + if (mUnk_18 > 0) { + mUnk_47 = 0; + } + return 0; + } + TilePos sp5a = gMapManager->func_ov00_02083a1c(vec); + sp1B0.x = vec->x; + sp1B0.y = vec->y; + sp1B0.z = vec->z; + gMapManager->func_ov00_02083c7c(&sp1B0, sp5a); + sp1B0.y = vec->y; + temp_r1 = mUnk_18; + if (temp_r1 > 0) { + TilePos sp24_unk1C = sp5a; + TilePos sp24_unk6 = mUnk_1c[temp_r1 - 1]; + TilePos sp24_unk1E = sp24_unk6; + if (sp24_unk1E == sp24_unk1C) { + return 0; + } + gMapManager->func_ov00_02083c7c(&sp1A4, sp24_unk6); + var_r1 = vec->x - sp1A4.x; + if (var_r1 < 0) { + var_r1 = 0 - var_r1; + } + if (var_r1 < 0x1000) { + var_r1_2 = vec->z - sp1A4.z; + if (var_r1_2 < 0) { + var_r1_2 = 0 - var_r1_2; + } + if (var_r1_2 < 0x1000) { + return 0; + } + } + } + func_ov014_02124ff4(&sp194); + if (mUnk_18 <= 0) { + var_r6 = gPlayerPos.y; + sp18 = gPlayerPos.x; + sp1B0.y = var_r6; + sp14 = gPlayerPos.z; + } else { + var_r6 = mUnk_2c.y; + sp18 = mUnk_2c.x; + sp14 = mUnk_2c.z; + sp11C.x = sp1B0.x; + sp11C.y = sp1B0.y; + sp11C.z = sp1B0.z; + sp1B0.y = gMapManager->MapData_vfunc_68(&sp11C, 0); + } + var_r6_2 = var_r6 + sp194.pos.y; + temp_r1_2 = sp1B0.y + sp194.pos.y; + sp1B0.y = temp_r1_2; + sp188.x = sp1B0.x; + sp188.y = temp_r1_2; + sp188.z = sp1B0.z; + sp110.x = sp18; + sp110.y = var_r6_2; + sp110.z = sp14; + Vec3p_Sub(&sp188, &sp110, &sp188); + var_r7 = sp188.y; + sp188.y = 0; + sp20 = Vec3p_Length(&sp188); + sp1C = 0; + if (Vec3p_TryNormalize(&sp188) == 0) { + return 0; + } + if (sp20 > 0x7000) { + Vec3p_Scale(&sp188, 0x7000); + sp1C = 1; + } else if (sp20 >= 0x1000) { + if (mUnk_18 > 0 || ABS(var_r7) > 0) { + Vec3p_Scale(&sp188, 0x1000); + sp1C = 1; + } + } + if (sp1C != 0) { + sp1B0.x = sp18 + sp188.x; + sp1B0.z = sp14 + sp188.z; + TilePos sp58 = gMapManager->func_ov00_02083a1c(&sp1B0); + gMapManager->func_ov00_02083c7c(&sp1B0, sp58); + temp_r1_3 = sp1B0.y + 0x999; + sp1B0.y = temp_r1_3; + sp104.x = sp1B0.x; + sp104.x = temp_r1_3; + sp104.x = sp1B0.z; + temp_r0_3 = gMapManager->MapData_vfunc_68(&sp104, 0); + sp1B0.y = temp_r0_3; + temp_r0_4 = temp_r0_3 + sp194.pos.y; + sp1B0.y = temp_r0_4; + vec->x = sp1B0.x; + vec->y = temp_r0_4; + vec->z = sp1B0.z; + } + if (this->func_ov058_0219a3b4(sp5a) != 0) { + temp_r0_5 = this->func_ov058_02199ef0(sp5a); + sp1B0.y = temp_r0_5; + temp_r0_6 = temp_r0_5 + sp194.pos.y; + sp1B0.y = temp_r0_6; + vec->x = sp1B0.x; + vec->y = temp_r0_6; + vec->z = sp1B0.z; + } + if (mUnk_18 > 0) { + if (this->func_ov058_0219a3b4(mUnk_1c[mUnk_18 - 1]) != 0) { + var_r6_2 = this->func_ov058_02199ef0(mUnk_1c[mUnk_18 - 1]); + } + if (gMapManager->MapData_vfunc_54(&mUnk_1c[mUnk_18 - 1]) == 0x19) { + temp_r0_7 = gMapManager->MapData_vfunc_60(&mUnk_1c[mUnk_18 - 1]); + spF8.x = sp18; + spF8.y = temp_r0_7 - 0x1333; + spF8.z = sp14; + var_r6_2 = gMapManager->MapData_vfunc_68(&spF8, 0); + if ((sp1B0.y - var_r6_2) >= 0x999) { + return 0; + } + } + } + sp1D4.mUnk_00_x = -1; + sp1D4.mUnk_02 = -1; + sp1D4.mUnk_04 = -1; + sp1D4.mUnk_06 = -1; + sp1D4.mUnk_00.z = 0; + sp214.mUnk_0e = 0; + sp214.mUnk_0f = 0; + sp214.mUnk_10 = 0; + sp214.mUnk_11 = 0; + sp214.mUnk_18 = 0U; + sp214.mUnk_19 = 0U; + sp214.mUnk_1a = 0; + sp214.mUnk_1b = 0; + sp214.mUnk_1c = 0; + sp214.mUnk_1d = 0; + if (var_r6_2 < sp1B0.y) { + if ((sp1B0.y - var_r6_2) < 0x999) { + var_r6_2 = sp1B0.y; + } else { + spEC.x = sp18; + spEC.z = sp14; + spEC.y = var_r6_2; + gMapManager->MapData_vfunc_6c(&spEC, &sp64, &sp17C); + if ((sp17C.x != 0) || (sp17C.z != 0)) { + var_r6_2 += 0x99A; + if (var_r6_2 >= sp1B0.y) { + var_r6_2 = sp1B0.y; + } + } + } + } else { + sp1B0.y = var_r6_2; + } + sUnk_02198d00.mUnk_10.x = 0; + sUnk_02198d00.mUnk_10.y = 0; + spD4.y = var_r6_2; + spE0.x = sp1B0.x; + spE0.y = sp1B0.y; + spE0.z = sp1B0.z; + spD4.x = sp18; + spD4.z = sp14; + sp194.pos.y = 9; + sp194.pos.z = 0xCF; + sp194.radius = 1; + temp_r0_8 = gMapManager->func_01ffbe78(&sp1D4.mUnk_00, &spE0, &spD4, &sp194); + if (sUnk_02198d00.mUnk_10.x != 0) { + return 0; + } + if (temp_r0_8 != 0) { + if (sUnk_02198d00.mUnk_10.y != 0) { + sp1B0.x = sUnk_02198d00.mUnk_14.x; + sp1B0.y = sUnk_02198d00.mUnk_14.y; + sp1B0.z = sUnk_02198d00.mUnk_14.z; + sp1B0.y = mUnk_20.y; + TilePos sp56 = gMapManager->func_ov00_02083a1c(&sp1B0); + sp5a.x = sp56.x; + sp5a.y = sp56.y; + vec->x = sp1B0.x; + vec->y = sp1B0.y; + vec->z = sp1B0.z; + mUnk_38.x = sp1B0.x; + mUnk_38.y = sp1B0.y; + mUnk_38.z = sp1B0.z; + mUnk_47 = 0; + mUnk_46 = 1; + } else { + if (sp214.mUnk_18 != 0) { + if (mUnk_18 <= 0) { + return 0; + } + sp170.x = sp1D4.mUnk_00.x; + sp170.y = sp1D4.mUnk_00.y; + sp170.z = sp1D4.mUnk_00.z; + TilePos sp54 = gMapManager->func_ov00_02083a1c(&sp170); + sp5a = sp54; + if (this->func_ov058_0219a3b4(sp5a) != 0) { + return 0; + } + gMapManager->func_ov00_02083c7c(&sp170, sp5a); + TilePos sp24_unk18 = sp5a; + TilePos sp24_unk1A = mUnk_1c[mUnk_18 - 1]; + if (sp24_unk1A == sp24_unk18) { + sp164.x = sp1D4.mUnk_00.x; + spBC.y = var_r6_2; + sp164.y = sp1D4.mUnk_00.y; + sp164.z = sp1D4.mUnk_00.z; + spBC.x = sp18; + spBC.z = sp14; + Vec3p_Sub(&sp164, &spBC, &sp164); + var_r0_2 = sp164.z; + if (var_r0_2 < 0) { + var_r0_2 = 0 - var_r0_2; + } + var_r1_3 = sp164.x; + if (var_r1_3 < 0) { + var_r1_3 = 0 - var_r1_3; + } + if (var_r1_3 > var_r0_2) { + sp164.z = 0; + } else { + sp164.x = 0; + } + if (Vec3p_TryNormalize(&sp164) != 0) { + sp170.x = sp18; + sp170.y = var_r6_2; + sp170.z = sp14; + Vec3p_Add(&sp170, &sp164, &sp170); + } else { + return 0; + } + TilePos sp52 = gMapManager->func_ov00_02083a1c(&sp170); + sp5a = sp52; + if (this->func_ov058_0219a3b4(sp5a) != 0) { + return 0; + } + sUnk_02198d00.mUnk_10.x = 0; + sUnk_02198d00.mUnk_10.y = 0; + spB0.y = var_r6_2; + spB0.x = sp18; + spB0.z = sp14; + sp194.pos.y = 9; + sp194.pos.z = 0xCF; + sp194.radius = 1; + temp_r0_16 = gMapManager->func_01ffbe78(&sp1D4.mUnk_00, &sp170, &spB0, &sp194); + if (sUnk_02198d00.mUnk_10.x != 0) { + return 0; + } + if (temp_r0_16 == 0) { + TilePos sp50 = gMapManager->func_ov00_02083a1c(&sp170); + TilePos sp24_unk4 = sp50; + TilePos sp24_unk14 = sp24_unk4; + TilePos sp24_unk16 = mUnk_1c[mUnk_18 - 1]; + if (sp24_unk16 == sp24_unk14) { + return 0; + } + gMapManager->func_ov00_02083c7c(&sp170, sp24_unk4); + } else { + if (sp214.mUnk_18 == 0) { + return false; + } + sp170.x = sp1D4.mUnk_00.x; + sp170.y = sp1D4.mUnk_00.y; + sp170.z = sp1D4.mUnk_00.z; + TilePos sp4E = gMapManager->func_ov00_02083a1c(&sp170); + sp5a = sp4E; + TilePos sp24_unk2 = sp5a; + TilePos sp24_unk10 = sp24_unk2; + TilePos sp24_unk12 = mUnk_1c[mUnk_18 - 1]; + if (sp24_unk12 == sp24_unk10) { + return 0; + } + gMapManager->func_ov00_02083c7c(&sp170, sp24_unk2); + } + } + sp1B0.x = sp170.x; + spA4.x = sp170.x; + temp_r1_14 = sp170.y + 0x999; + sp1B0.y = sp170.y; + sp1B0.z = sp170.z; + spA4.z = sp170.z; + sp1B0.y = temp_r1_14; + spA4.y = temp_r1_14; + temp_r0_21 = gMapManager->MapData_vfunc_68(&spA4, 0); + sp1B0.y = temp_r0_21; + temp_r0_22 = temp_r0_21 + sp194.pos.y; + sp1B0.y = temp_r0_22; + vec->x = sp1B0.x; + vec->y = temp_r0_22; + vec->z = sp1B0.z; + } else { + if (sp214.mUnk_19 == 0) { + return 0; + } + sp158.x = sp1D4.mUnk_00.x; + sp158.y = sp1D4.mUnk_00.y; + sp158.z = sp1D4.mUnk_00.z; + TilePos sp4C = gMapManager->func_ov00_02083a1c(&sp158); + sp5a.x = sp4C.x; + sp5a.y = sp4C.y; + TilePos sp24_unk0 = sp5a; + TilePos sp24_unkC = sp24_unk0; + TilePos sp24_unkE = mUnk_1c[mUnk_18 - 1]; + if (sp24_unkE == sp24_unkC) { + return 0; + } + gMapManager->func_ov00_02083c7c(&sp158, sp24_unk0); + sp1B0.x = sp158.x; + sp98.x = sp158.x; + temp_r1_10 = sp158.y + 0x999; + sp1B0.y = sp158.y; + sp1B0.z = sp158.z; + sp98.z = sp158.z; + sp1B0.y = temp_r1_10; + sp98.y = temp_r1_10; + temp_r0_13 = gMapManager->MapData_vfunc_68(&sp98, 0); + sp1B0.y = temp_r0_13; + sp1B0.y = temp_r0_13 + sp194.pos.y; + } + } + } else { + MapManager *temp_r7_2 = gMapManager; + TilePos sp4a = temp_r7_2->func_ov00_02083a1c(&sp1B0); + if (temp_r7_2->MapData_vfunc_54(&sp4a) == 0x19) { + MapManager *temp_r7_3 = gMapManager; + TilePos sp48 = temp_r7_3->func_ov00_02083a1c(&sp1B0); + temp_r0_9 = temp_r7_3->MapData_vfunc_60(&sp48); + sp1B0.y = temp_r0_9; + sp1B0.y = temp_r0_9 - 0x1333; + } + sp8C.x = sp1B0.x; + sp8C.y = sp1B0.y; + sp8C.z = sp1B0.z; + sp1B0.y = gMapManager->MapData_vfunc_68(&sp8C, 0); + } + sp14C.y = var_r6_2; + sp14C.x = sp18; + sp140.y = var_r6_2; + sp14C.z = sp14; + var_r6_3 = 1; + sp140.x = sp18; + sp140.z = sp14; + while (true) { + if (func_0202b2f8(&sp14C, &sp1B0, 0x1000) != 0) { + var_r6_3 = 0; + } + MapManager::func_ov00_02083fb0(&sp60, gMapManager, &sp14C); + if (((3 & (sp60 >> 5)) == 2) && ((sp60 & 0x1F) != 0xA)) { + sp1B0.y = sp140.y; + temp_r0_23 = sp140.y + 0x999; + sp1B0.y = temp_r0_23; + sp80.y = temp_r0_23; + sp1B0.z = sp140.z; + sp80.z = sp140.z; + sp1B0.x = sp140.x; + sp80.x = sp140.x; + temp_r0_24 = gMapManager->MapData_vfunc_68(&sp80, 0); + sp1B0.y = temp_r0_24; + temp_r0_25 = temp_r0_24 + sp194.pos.y; + sp1B0.y = temp_r0_25; + vec->x = sp1B0.x; + vec->y = temp_r0_25; + vec->z = sp1B0.z; + TilePos sp46 = gMapManager->func_ov00_02083a1c(&sp1B0); + sp5a = sp46; + TilePos sp24_unk8 = sp5a; + TilePos sp24_unkA = mUnk_1c[mUnk_18 - 1]; + if (sp24_unkA == sp24_unk8) { + return 0; + } + goto block_114; + } else { + sp140.x = sp14C.x; + sp140.y = sp14C.y; + sp140.z = sp14C.z; + } + if (var_r6_3 == 0) { + block_114: + if (this->func_ov058_0219a3b4(sp5a) != 0) { + TilePos sp44 = gMapManager->func_ov00_02083a1c(&sp1B0); + temp_r0_27 = this->func_ov058_02199ef0(sp44); + sp1B0.y = temp_r0_27; + sp1B0.y = temp_r0_27 + sp194.pos.y; + } else { + sp74.x = sp1B0.x; + sp74.y = sp1B0.y; + sp74.z = sp1B0.z; + MapManager::func_ov00_02083fb0(&sp5C, gMapManager, &sp74); + if (((3 & (sp5C >> 5)) == 2) && ((0x1F & sp5C) != 0xA)) { + return 0; + } + } + mUnk_1c[mUnk_18] = sp5a; + mUnk_18 += 1; + sp134.x = sp1B0.x; + sp134.y = sp1B0.y; + sp134.z = sp1B0.z; + Vec3p_Sub(&sp134, &mUnk_20, &sp134); + mUnk_2c = sp1B0; + if (mUnk_18 <= 1) { + mUnk_20 = sp1B0; + } + mUnk_14 = 1; + return 1; + } + } +} + +extern "C" void func_ov000_020a61ac(Vec3p *vec, s16 angle); +ARM unk32 EquipBombchu::func_ov058_02199ef0(TilePos param1) { + s32 iVar1; + s32 iVar2; + s16 sVar3; + s32 result; + Vec3p local_58; + Vec3p local_4c; + Vec3p local_40; + + TilePos local_5c = param1; + gMapManager->func_ov00_02083c7c(&local_40, local_5c); + for (s32 iVar2 = 0; iVar2 < 4; iVar2++) { + sVar3 = 0; + local_58.x = 0; + local_58.y = 0; + local_58.z = 0x400; + func_ov000_020a61ac(&local_58, (int) sVar3); + local_4c.x = local_40.x; + local_4c.y = local_40.y; + local_4c.z = local_40.z; + Vec3p_Add(&local_4c, &local_58, &local_4c); + if (iVar2 == 0) { + result = gMapManager->func_ov00_02083f44(&local_4c, false); + } else { + iVar1 = gMapManager->func_ov00_02083f44(&local_4c, false); + if (result <= iVar1) { + result = iVar1; + } + } + sVar3 = sVar3 + 0x4000; + } + return result; +} + +ARM unk32 EquipBombchu::func_ov058_02199fd8(TilePos param1) { + if (data_ov058_0219aee0 != -1) { + if (data_ov058_0219b110 == param1) { + return data_ov058_0219aee0; + } + } + data_ov058_0219aee0 = this->func_ov058_0219a084(param1); + data_ov058_0219b110 = param1; + return data_ov058_0219aee0; +} + +ARM unk32 EquipBombchu::func_ov058_0219a084(TilePos param1) { + Vec3p sp3C[4]; + + Vec3p sp30; + gMapManager->func_ov00_02083c7c(&sp30, param1); + Vec3p sp24; + for (s32 i = 0; i < 4; i++) { + sp24.x = 0; + sp24.y = 0; + sp24.z = FLOAT_TO_Q20(0.25); + func_ov000_020a61ac(&sp24, 0x4000 * i); + sp3C[i] = sp30; + Vec3p_Add(&sp3C[i], &sp24, &sp3C[i]); + sp3C[i].y = gMapManager->func_ov00_02083f44(&sp3C[i], 0); + } + if ((sp3C[0].y == sp3C[1].y) && (sp3C[0].y == sp3C[2].y) && (sp3C[0].y == sp3C[3].y)) { + UnkStruct sp90; + if (gMapManager->func_01ffbf5c(&sp90, &sp3C[0], &sp3C[2], 0x200, 9, 1, &sUnk_02198d00, 0)) { + return 7; + } + if (gMapManager->func_01ffbf5c(&sp90, &sp3C[1], &sp3C[3], 0x200, 9, 1, &sUnk_02198d00, 0)) { + return 7; + } + if (gMapManager->func_01ffbf5c(&sp90, &sp3C[2], &sp3C[0], 0x200, 9, 1, &sUnk_02198d00, 0)) { + return 7; + } + if (gMapManager->func_01ffbf5c(&sp90, &sp3C[3], &sp3C[1], 0x200, 9, 1, &sUnk_02198d00, 0)) { + return 7; + } + return 0; + } + if ((sp3C[0].y == sp3C[1].y) && (sp3C[2].y == sp3C[3].y)) { + if (sp3C[0].y < sp3C[2].y) { + return 4; + } + return 1; + } + if ((sp3C[0].y == sp3C[3].y) && (sp3C[1].y == sp3C[2].y)) { + if (sp3C[0].y < sp3C[1].y) { + return 3; + } + return 2; + } + + Vec3p sp18; + unk32 sp14; + gMapManager->MapData_vfunc_6c(&sp30, &sp14, &sp18); + if ((sp18.x != 0) || (sp18.z != 0)) { + return 5; + } + return 7; +} + +bool EquipBombchu::func_ov058_0219a3b4(TilePos param1) { + switch (this->func_ov058_02199fd8(param1)) { + case 1: + case 2: + case 3: + case 4: + case 7: + return true; + default: + return false; + } +} diff --git a/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp b/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp index 7fac2ba5..acaa3bd3 100644 --- a/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp +++ b/src/59_Hammer/Actor/Navi/ActorNaviBase_59.cpp @@ -7,8 +7,8 @@ #include "Player/PlayerBase.hpp" #include "Player/PlayerControl.hpp" -extern unk32 data_ov000_020dc7d0; -extern unk32 data_ov000_020dc7e4; +extern const ItemManager_Unk1 data_ov000_020dc7d0; +extern const ItemManager_Unk1 data_ov000_020dc7e4; extern u32 data_ov000_020e9370[]; extern "C" void Vec3p_RotateY(u32, Vec3p *); extern "C" void func_ov005_02102c2c(u32 *param_1, int param_2, Vec3p *param_3, int param_4, int param_5, u32 param_6, @@ -58,200 +58,99 @@ ARM void ActorNavi::func_ov059_0219aa08() { } } -struct UnkStruct { - /* 00 */ u16 mUnk_00; - /* 02 */ unk16 mUnk_02; - /* 04 */ unk16 mUnk_04; - /* 06 */ unk16 mUnk_06; - /* 08 */ unk16 mUnk_08; - /* 09 */ unk8 mUnk_09; - /* 0a */ unk8 mUnk_0a; - /* 0b */ unk8 mUnk_0b; - /* 0c */ unk8 mUnk_0c; - /* 0d */ unk8 mUnk_0d; - /* 0e */ unk8 mUnk_0e; - /* 0f */ unk8 mUnk_0f; - /* 10 */ unk8 mUnk_10; - /* 11 */ unk8 mUnk_11; - /* 12 */ unk8 mUnk_12; - /* 13 */ unk8 mUnk_13; - /* 14 */ Vec3p mUnk_14; - /* 14 */ unk8 mUnk_20[4]; - /* 24 */ -}; - // non-matching ARM void ActorNavi::func_ov059_0219aba8(u32 param1) { - bool bVar1; - LinkStateItem *uVar1; - ItemManager *pIVar3; - int uVar4; - int iVar5; - int uVar6; - bool bVar7; - Vec3p local_134; - Vec3p local_128; - Vec3p local_11c; - Vec3p local_110; - Vec3p local_104; - Vec3p local_e4; - - UnkStruct auStack_e0; - u16 local_bc; - unk16 local_ba; - unk16 local_b8; - unk16 local_b6; - unk16 local_b4; - unk32 local_92; - unk32 local_91; - unk32 local_90; - unk32 local_8f; - unk32 local_88; - unk32 local_87; - unk32 local_86; - unk32 local_85; - unk32 local_84; - unk32 local_83; - UnkStruct auStack_80; - u16 local_5c; - unk16 local_5a; - unk16 local_58; - unk16 local_56; - unk16 local_54; - unk32 local_32; - unk32 local_31; - unk32 local_30; - unk32 local_2f; - unk32 local_28; - unk32 local_27; - unk32 local_26; - unk32 local_25; - unk32 local_24; - unk32 local_23; - ItemManager *puVar1; - switch (param1) { - case 3: - uVar1 = EquipHammer::GetLinkStateItem(); + case 3: { + LinkStateItem *uVar1 = EquipHammer::GetLinkStateItem(); if (uVar1->mUnk_25[2] != 0 && uVar1->mUnk_25[3] != 0) { break; } - local_11c.x = data_027e0fd4->mUnk_020.pos.x; - local_11c.z = data_027e0fd4->mUnk_020.pos.z; - - iVar5 = gPlayerPos.y + FLOAT_TO_Q20(0.5); - uVar4 = this->mPos.x; - uVar6 = this->mPos.z; - - auStack_80.mUnk_00 = -1; - auStack_80.mUnk_02 = 0; - auStack_80.mUnk_04 = 0; - auStack_80.mUnk_06 = 0; - auStack_80.mUnk_08 = 0; - auStack_80.mUnk_09 = 0; - auStack_80.mUnk_0a = 0; - auStack_80.mUnk_0b = 0; - auStack_80.mUnk_0c = 0; - auStack_80.mUnk_0d = 0; - auStack_80.mUnk_0e = 0; - auStack_80.mUnk_0f = 0; - auStack_80.mUnk_10 = 0; - auStack_80.mUnk_11 = 0; - auStack_80.mUnk_12 = 0; - local_11c.y = iVar5; - - local_110.x = uVar4; - local_110.y = iVar5; - // local_110.z = uVar6; - - local_e4.x = local_11c.x; - local_e4.y = iVar5; - local_e4.z = local_11c.z; - - local_5a = local_5c; - local_58 = local_5c; - local_56 = local_5c; - - if (gMapManager->func_01ffbf5c(&auStack_80, &local_110, &local_11c, this->mUnk_08c.size) ? false : true) { - this->mPos = local_e4; - this->mPrevPos = local_e4; - this->mOffsetPos = local_e4; - } else { + Vec3p local_11c = data_027e0fd4->mUnk_020.pos; + + q20 iVar5 = gPlayerPos.y + FLOAT_TO_Q20(0.5); + q20 uVar4 = this->mPos.x; + q20 uVar6 = this->mPos.z; + + UnkStruct auStack_80; + local_11c.y = iVar5; + + Vec3p local_110 = {uVar4, iVar5, uVar6}; + + Vec3p local_e4 = local_11c; + + // if (gMapManager->func_01ffbf5c(&auStack_80, &local_110, &local_11c, this->mUnk_08c.size, 0, 0, NULL, 0) ? false + if (gMapManager->func_01ffbf5c(&auStack_80, &local_110, &local_11c, this->mUnk_08c.size, this->mRef.id, + this->mUnk_09c.mUnk_0, this->mUnk_09c.mUnk_4, 0) + ? false + : true) { this->mOffsetPos.x = uVar4; this->mOffsetPos.y = iVar5; this->mOffsetPos.z = uVar6; + } else { + this->mPos.x = local_e4.x; + this->mPos.y = local_e4.y; + this->mPos.z = local_e4.z; + this->mPrevPos = local_e4; + this->mOffsetPos = local_e4; } - break; - case 4: - uVar1 = EquipHammer::GetLinkStateItem(); + } break; + case 4: { + LinkStateItem *uVar1 = EquipHammer::GetLinkStateItem(); if (uVar1->mUnk_25[2] != 0 && uVar1->mUnk_25[3] != 0) { break; } - auStack_e0.mUnk_14.x = data_027e0fd4->mUnk_020.pos.x; - auStack_e0.mUnk_14.y = gPlayerPos.y + FLOAT_TO_Q20(0.5); - auStack_e0.mUnk_14.z = data_027e0fd4->mUnk_020.pos.z; - - bVar1 = gPlayerControl->UpdateAimWorld(&local_104); - bVar7 = false; - local_104.y = auStack_e0.mUnk_14.y; - auStack_80.mUnk_00 = -1; - auStack_80.mUnk_02 = 0; - auStack_80.mUnk_04 = 0; - auStack_80.mUnk_06 = 0; - auStack_80.mUnk_08 = 0; - auStack_80.mUnk_09 = 0; - auStack_80.mUnk_0a = 0; - auStack_80.mUnk_0b = 0; - auStack_80.mUnk_0c = 0; - auStack_80.mUnk_0d = 0; - auStack_80.mUnk_0e = 0; - auStack_80.mUnk_0f = 0; - auStack_80.mUnk_10 = 0; - auStack_80.mUnk_11 = 0; - auStack_80.mUnk_12 = 0; - local_ba = local_bc; - local_b8 = local_bc; - local_b6 = local_bc; + Vec3p local_f8 = data_027e0fd4->mUnk_020.pos; + local_f8.y = gPlayerPos.y + FLOAT_TO_Q20(0.5); + Vec3p local_104; + bool bVar1 = gPlayerControl->UpdateAimWorld(&local_104); + local_104.y = local_f8.y; + UnkStruct auStack_e0; + bool bVar7 = false; + UnkStruct auStack_80; if (bVar1) { - local_128 = auStack_e0.mUnk_14; + s32 id = this->mRef.id; + Vec3p local_128 = local_f8; - // local_134.x = local_104.x; - // local_134.y = auStack_e0.mUnk_14.y; - // local_134.z = local_104.z; + Vec3p local_134; + local_134 = local_104; + local_134.y = local_f8.y; - if (!gMapManager->func_01ffbf5c(&auStack_e0, &local_134, &local_128, this->mUnk_08c.size)) { + if (!gMapManager->func_01ffbf5c(&auStack_e0, &local_134, &local_128, this->mUnk_08c.size, id, + this->mUnk_09c.mUnk_0, this->mUnk_09c.mUnk_4, 0)) { bVar7 = true; } - } - if (!bVar7) { - this->mPos = auStack_e0.mUnk_14; - this->mPrevPos = auStack_e0.mUnk_14; - this->mOffsetPos = auStack_e0.mUnk_14; + if (!bVar7) { + this->mPos = auStack_e0.mUnk_3c; + this->mPrevPos = auStack_e0.mUnk_3c; + this->mOffsetPos = auStack_e0.mUnk_3c; + } + break; + default: + this->func_ov000_020b853c(); + break; } - break; - default: - this->func_ov000_020b853c(); - break; + } } - pIVar3 = gItemManager; + void *pvVar2; switch (param1) { case 3: - pIVar3->func_ov00_020ad538(data_ov000_020dc7d0); - pIVar3->func_ov000_020c0c44(&this->mUnk_2f0); - pIVar3->func_ov000_020c0e5c(&this->mUnk_2f0, 0); + pvVar2 = gItemManager->func_ov00_020ad538(&data_ov000_020dc7d0); + this->mUnk_2f0.func_ov000_020c0c44(pvVar2); + this->mUnk_2f0.func_ov000_020c0e5c(0); break; case 4: this->mUnk_348 = 0; - pIVar3->func_ov00_020ad538(data_ov000_020dc7e4); - pIVar3->func_ov000_020c0c44(&this->mUnk_2f0); - pIVar3->func_ov000_020c0e5c(&this->mUnk_2f0, 1); + pvVar2 = gItemManager->func_ov00_020ad538(&data_ov000_020dc7e4); + this->mUnk_2f0.func_ov000_020c0c44(pvVar2); + this->mUnk_2f0.func_ov000_020c0e5c(1); break; default: break; diff --git a/src/59_Hammer/Player/EquipHammer.cpp b/src/59_Hammer/Player/EquipHammer.cpp index cfccec9b..3928cb6e 100644 --- a/src/59_Hammer/Player/EquipHammer.cpp +++ b/src/59_Hammer/Player/EquipHammer.cpp @@ -161,7 +161,7 @@ ARM void LinkStateItem::func_ov059_02198ffc() { local_20 = *this->GetPlayerPos(); Vec3p_Sub(&local_14, &local_20, &local_14); - dest = Atan2(local_14.x, local_14.z); + dest = FX_Atan2Idx(local_14.x, local_14.z); ApproachAngle_thunk(this->GetPlayerAngle(), dest, 0x2000); } diff --git a/src/ITCM/Map/MapManager.cpp b/src/ITCM/Map/MapManager.cpp index 467b0990..2cf203c7 100644 --- a/src/ITCM/Map/MapManager.cpp +++ b/src/ITCM/Map/MapManager.cpp @@ -1,6 +1,7 @@ #include "Map/MapManager.hpp" -bool MapManager::func_01ffbe78(Vec3p *param1, Vec3p *param2, Vec3p *param3, Vec4p *param4) {} -bool MapManager::func_01ffbf5c(struct UnkStruct *param1, Vec3p *param2, Vec3p *param3, s32 length) {} +bool MapManager::func_01ffbe78(Vec3p *param1, Vec3p *param2, Vec3p *param3, Sphere *param4) {} +bool MapManager::func_01ffbf5c(struct UnkStruct *param1, Vec3p *param2, Vec3p *param3, s32 length, unk32 param5, unk32 param6, + UnkStruct_ov000_020beba8 *param7, unk32 param8) {} bool MapManager::func_01ffc118(s32 *param1, Vec3p *param2, Vec3p *param3, s32 param4, s32 *param5, u32 param6, s32 *param7) {} bool MapManager::func_01ffd1e0(s32 *param1, Vec3p *param2, Vec3p *param3, s32 param4, s32 *param5, u32 param6, s32 *param7) {} |
