diff --git a/config/eur/arm9/overlays/ov000/symbols.txt b/config/eur/arm9/overlays/ov000/symbols.txt index 1deef029..6a56a143 100644 --- a/config/eur/arm9/overlays/ov000/symbols.txt +++ b/config/eur/arm9/overlays/ov000/symbols.txt @@ -579,7 +579,7 @@ _ZN10MapManager18func_ov00_02083614Ei kind:function(arm,size=0x10) addr:0x208361 _ZN10MapManager14GetEntrancePosEP5Vec3pi kind:function(arm,size=0x40) addr:0x2083624 _ZN10MapManager18func_ov00_02083664EP5Vec3pi kind:function(arm,size=0x58) addr:0x2083664 _ZN10MapManager18func_ov00_020836bcEjPi kind:function(arm,size=0x10) addr:0x20836bc -_ZN10MapManager18func_ov00_020836ccEjP4AABBj kind:function(arm,size=0x10) addr:0x20836cc +_ZN10MapManager23GetTriggerBoundingBoxesEjP4AABBj kind:function(arm,size=0x10) addr:0x20836cc _ZN10MapManager18func_ov00_020836dcEii kind:function(arm,size=0x94) addr:0x20836dc _ZN10MapManager18func_ov00_02083770Eji kind:function(arm,size=0x10) addr:0x2083770 _ZN10MapManager18func_ov00_02083780Ei kind:function(arm,size=0x10) addr:0x2083780 @@ -914,7 +914,7 @@ func_ov000_0208e6b0 kind:function(arm,size=0x40) addr:0x208e6b0 func_ov000_0208e6f0 kind:function(arm,size=0x14) addr:0x208e6f0 func_ov000_0208e704 kind:function(arm,size=0x14) addr:0x208e704 func_ov000_0208e718 kind:function(arm,size=0x14) addr:0x208e718 -func_ov000_0208e72c kind:function(arm,size=0x78) addr:0x208e72c +_ZN4AABB8ContainsEP5Vec3p kind:function(arm,size=0x78) addr:0x208e72c _ZN4AABB12ContainsInXZEP5Vec3p kind:function(arm,size=0x44) addr:0x208e7a4 func_ov000_0208e7e8 kind:function(arm,size=0x44) addr:0x208e7e8 func_ov000_0208e82c kind:function(arm,size=0x50) addr:0x208e82c @@ -2851,7 +2851,7 @@ _ZN12ActorManager18func_ov00_020c399cEjP8Cylinder kind:function(arm,size=0x10) a _ZN12ActorManager18func_ov00_020c39acEjPjb kind:function(arm,size=0x180) addr:0x20c39ac _ZN12ActorManager18func_ov00_020c3b2cEPi kind:function(arm,size=0x84) addr:0x20c3b2c _ZN12ActorManager18func_ov00_020c3bb0EiPi kind:function(arm,size=0x138) addr:0x20c3bb0 -_ZN12ActorManager18func_ov00_020c3ce8Eii kind:function(arm,size=0xe8) addr:0x20c3ce8 +_ZN12ActorManager18func_ov00_020c3ce8Eib kind:function(arm,size=0xe8) addr:0x20c3ce8 _ZN12ActorManager14Actor_vfunc_28Ev kind:function(arm,size=0x4c) addr:0x20c3dd0 _ZN12ActorManager16ActorTypeIsOneOfEjPj kind:function(arm,size=0x38) addr:0x20c3e1c func_ov000_020c3e54 kind:function(arm,size=0x8) addr:0x20c3e54 diff --git a/config/usa/arm9/overlays/ov000/symbols.txt b/config/usa/arm9/overlays/ov000/symbols.txt index b5f107f9..8f2b644c 100644 --- a/config/usa/arm9/overlays/ov000/symbols.txt +++ b/config/usa/arm9/overlays/ov000/symbols.txt @@ -579,7 +579,7 @@ _ZN10MapManager18func_ov00_02083614Ei kind:function(arm,size=0x10) addr:0x20835b _ZN10MapManager14GetEntrancePosEP5Vec3pi kind:function(arm,size=0x40) addr:0x20835c4 _ZN10MapManager18func_ov00_02083664EP5Vec3pi kind:function(arm,size=0x58) addr:0x2083604 _ZN10MapManager18func_ov00_020836bcEjPi kind:function(arm,size=0x10) addr:0x208365c -_ZN10MapManager18func_ov00_020836ccEjP4AABBj kind:function(arm,size=0x10) addr:0x208366c +_ZN10MapManager23GetTriggerBoundingBoxesEjP4AABBj kind:function(arm,size=0x10) addr:0x208366c _ZN10MapManager18func_ov00_020836dcEii kind:function(arm,size=0x94) addr:0x208367c _ZN10MapManager18func_ov00_02083770Eji kind:function(arm,size=0x10) addr:0x2083710 _ZN10MapManager18func_ov00_02083780Ei kind:function(arm,size=0x10) addr:0x2083720 @@ -914,7 +914,7 @@ func_ov000_0208e6b0 kind:function(arm,size=0x40) addr:0x208e650 func_ov000_0208e6f0 kind:function(arm,size=0x14) addr:0x208e690 func_ov000_0208e704 kind:function(arm,size=0x14) addr:0x208e6a4 func_ov000_0208e718 kind:function(arm,size=0x14) addr:0x208e6b8 -func_ov000_0208e72c kind:function(arm,size=0x78) addr:0x208e6cc +_ZN4AABB8ContainsEP5Vec3p kind:function(arm,size=0x78) addr:0x208e6cc _ZN4AABB12ContainsInXZEP5Vec3p kind:function(arm,size=0x44) addr:0x208e744 func_ov000_0208e7e8 kind:function(arm,size=0x44) addr:0x208e788 func_ov000_0208e82c kind:function(arm,size=0x50) addr:0x208e7cc @@ -2851,7 +2851,7 @@ _ZN12ActorManager18func_ov00_020c399cEjP8Cylinder kind:function(arm,size=0x10) a _ZN12ActorManager18func_ov00_020c39acEjPjb kind:function(arm,size=0x180) addr:0x20c394c _ZN12ActorManager18func_ov00_020c3b2cEPi kind:function(arm,size=0x84) addr:0x20c3acc _ZN12ActorManager18func_ov00_020c3bb0EiPi kind:function(arm,size=0x138) addr:0x20c3b50 -_ZN12ActorManager18func_ov00_020c3ce8Eii kind:function(arm,size=0xe8) addr:0x20c3c88 +_ZN12ActorManager18func_ov00_020c3ce8Eib kind:function(arm,size=0xe8) addr:0x20c3c88 _ZN12ActorManager14Actor_vfunc_28Ev kind:function(arm,size=0x4c) addr:0x20c3d70 _ZN12ActorManager16ActorTypeIsOneOfEjPj kind:function(arm,size=0x38) addr:0x20c3dbc func_ov000_020c3e54 kind:function(arm,size=0x8) addr:0x20c3df4 diff --git a/include/Actor/ActorManager.hpp b/include/Actor/ActorManager.hpp index d4acdc5f..88a9cc0b 100644 --- a/include/Actor/ActorManager.hpp +++ b/include/Actor/ActorManager.hpp @@ -90,7 +90,7 @@ public: Actor *func_ov00_020c39ac(u32 index, ActorTypeId *actorTypes, bool param3); s32 func_ov00_020c3b2c(s32 *param1); s32 func_ov00_020c3bb0(unk32 param1, s32 *param2); - void func_ov00_020c3ce8(unk32 param1, unk32 param2); + void func_ov00_020c3ce8(unk32 param1, bool param2); void Actor_vfunc_28(); static bool ActorTypeIsOneOf(ActorTypeId type, ActorTypeId *types); }; diff --git a/include/Map/MapManager.hpp b/include/Map/MapManager.hpp index 4e969c5a..ff3397b9 100644 --- a/include/Map/MapManager.hpp +++ b/include/Map/MapManager.hpp @@ -131,7 +131,7 @@ public: bool GetEntrancePos(Vec3p *param_2, unk32 entranceId); bool func_ov00_02083664(Vec3p *param_2, unk32 entranceId); s32 func_ov00_020836bc(u32 param_2, unk32 *param_3); - u32 func_ov00_020836cc(u32 param_2, AABB *param_3, u32 param_4); + s32 GetTriggerBoundingBoxes(u32 param_2, AABB *param_3, u32 param_4); unk8 func_ov00_020836dc(unk32 param_2, unk32 param_3); bool func_ov00_02083770(u32 param_2, unk32 param_3); bool func_ov00_02083780(unk32 param_2); diff --git a/include/Physics/AABB.hpp b/include/Physics/AABB.hpp index 07f64910..ef90ffcd 100644 --- a/include/Physics/AABB.hpp +++ b/include/Physics/AABB.hpp @@ -9,5 +9,6 @@ struct AABB { Vec3p min; Vec3p max; + bool Contains(Vec3p *vec); bool ContainsInXZ(Vec3p *vec); }; diff --git a/include/global.h b/include/global.h index 83b4c87f..617f672f 100644 --- a/include/global.h +++ b/include/global.h @@ -7,6 +7,8 @@ #define SET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] |= 1 << ((pos) & 0x1f)) #define RESET_FLAG(arr, pos) ((arr)[((u32) (pos)) >> 5] &= ~(1 << ((pos) & 0x1f))) +#define ARRAY_LEN(arr) ((sizeof(arr) / sizeof(*arr))) + // Prevent the IDE from reporting errors that the compiler/linker won't report #ifdef __INTELLISENSE__ #endif diff --git a/src/00_Core/Actor/ActorManager.cpp b/src/00_Core/Actor/ActorManager.cpp index 7809ad38..013a8276 100644 --- a/src/00_Core/Actor/ActorManager.cpp +++ b/src/00_Core/Actor/ActorManager.cpp @@ -1,5 +1,6 @@ #include "Actor/ActorManager.hpp" #include "DTCM/UnkStruct_027e103c.hpp" +#include "Map/MapManager.hpp" char *gShipParts[8] = {"anc", "bow", "hul", "can", "dco", "pdl", "fnl", "brg"}; @@ -250,28 +251,30 @@ ARM Actor *ActorManager::func_ov00_020c39ac(u32 index, ActorTypeId *actorTypes, Actor *actor = mActorTable[index]; Actor *result = NULL; if (actor != NULL && actor->mAlive) { - if (actorTypes != NULL || mMaxActorIndex > 0) { - for (s16 i = 0; i < mMaxActorIndex; ++i) { + if (mMaxActorIndex > 0) { + for (u16 i = 0; i < mMaxActorIndex; ++i) { if (i != index) { Actor *otherActor = mActorTable[i]; if (otherActor != NULL && func_ov000_020c3f08(mUnk_14, i)) { if ((actorTypes == NULL && !param3) || - (this->ActorTypeIsOneOf(mActorTable[i]->mType, actorTypes) != param3)) + (param3 != this->ActorTypeIsOneOf(mActorTable[i]->mType, actorTypes))) { - Cylinder oldHitbox = otherActor->mHitbox; - // q20 x = otherActor->mHitbox.pos.x; - // q20 y = otherActor->mHitbox.pos.y; - // q20 z = otherActor->mHitbox.pos.z; - // q20 size = otherActor->mHitbox.size; + Cylinder oldHitbox = mActorTable[i]->mHitbox; Cylinder *newHitbox = func_ov000_020c3ef0(mUnk_14, i); - otherActor->mHitbox = *newHitbox; - if (otherActor->CollidesWith(actor)) result = otherActor; - otherActor->mHitbox = oldHitbox; - // otherActor->mHitbox.pos.x = x; - // otherActor->mHitbox.pos.y = y; - // otherActor->mHitbox.pos.z = z; - // otherActor->mHitbox.size = size; + Actor *otherActor2 = mActorTable[i]; + otherActor2->mHitbox.pos.x = newHitbox->pos.x; + otherActor2->mHitbox.pos.y = newHitbox->pos.y; + otherActor2->mHitbox.pos.z = newHitbox->pos.z; + otherActor2->mHitbox.size = newHitbox->size; + if (mActorTable[i]->CollidesWith(actor)) { + result = mActorTable[i]; + } + + otherActor->mHitbox.pos.x = oldHitbox.pos.x; + otherActor->mHitbox.pos.y = oldHitbox.pos.y; + otherActor->mHitbox.pos.z = oldHitbox.pos.z; + otherActor->mHitbox.size = oldHitbox.size; if (result != NULL) return result; } @@ -284,9 +287,89 @@ ARM Actor *ActorManager::func_ov00_020c39ac(u32 index, ActorTypeId *actorTypes, return result; } -ARM s32 ActorManager::func_ov00_020c3b2c(s32 *param1) {} -ARM s32 ActorManager::func_ov00_020c3bb0(unk32 param1, s32 *param2) {} -ARM void ActorManager::func_ov00_020c3ce8(unk32 param1, unk32 param2) {} +ARM s32 ActorManager::func_ov00_020c3b2c(s32 *param1) { + if (param1 != NULL) *param1 = 0; + + s32 i; + s32 numAlive = 0; + + Actor **actorIter = mActorTable; + + for (i = 0; i < mMaxActorIndex; ++i, ++actorIter) { + Actor *actor = *actorIter; + if (actor != NULL && actor->mAlive && actor->mUnk_128) { + if (param1 != NULL && actor->mUnk_120 > 0) { + *param1 += 1; + } + numAlive += 1; + } + } + + return numAlive; +} + +ARM s32 ActorManager::func_ov00_020c3bb0(unk32 param1, s32 *param2) { + if (param2 != NULL) *param2 = 0; + + AABB boxes[8]; + s32 numBoxes = gMapManager->GetTriggerBoundingBoxes(param1, boxes, ARRAY_LEN(boxes)); + if (numBoxes <= 0) return 0; + + s32 i; + s32 numInBox = 0; + bool isInBox; + + Actor **actorIter = mActorTable; + for (i = 0; i < mMaxActorIndex; ++i, ++actorIter) { + Actor *actor = *actorIter; + if (actor != NULL && actor->mAlive && actor->mUnk_128) { + isInBox = false; + for (s32 j = 0; j < numBoxes; ++j) { + Actor *actor2 = *actorIter; + Vec3p pos; + pos.x = actor2->mPos.x; + pos.y = actor2->mPos.y; + pos.z = actor2->mPos.z; + if (boxes[j].ContainsInXZ(&pos)) { + isInBox = true; + break; + } + } + if (isInBox) { + if (param2 != NULL && (*actorIter)->mUnk_120 > 0) { + *param2 += 1; + } + numInBox += 1; + } + } + } + + return numInBox; +} + +ARM void ActorManager::func_ov00_020c3ce8(unk32 param1, bool param2) { + AABB boxes[8]; + s32 numBoxes = gMapManager->GetTriggerBoundingBoxes(param1, boxes, ARRAY_LEN(boxes)); + if (numBoxes <= 0) return; + + s32 i; + Actor **actorIter = mActorTable; + for (i = 0; i < mMaxActorIndex; ++i, ++actorIter) { + Actor *actor = *actorIter; + if (actor != NULL && actor->mAlive && actor->mUnk_128) { + for (s32 j = 0; j < numBoxes; ++j) { + Actor *actor2 = *actorIter; + Vec3p pos; + pos.x = actor2->mPos.x; + pos.y = actor2->mPos.y; + pos.z = actor2->mPos.z; + if (boxes[j].Contains(&pos)) { + (*actorIter)->SetUnk_129(param2); + } + } + } + } +} ARM void ActorManager::Actor_vfunc_28() { int i; diff --git a/src/00_Core/Map/MapManager.cpp b/src/00_Core/Map/MapManager.cpp index 3dc72153..69be3117 100644 --- a/src/00_Core/Map/MapManager.cpp +++ b/src/00_Core/Map/MapManager.cpp @@ -91,7 +91,7 @@ unk8 MapManager::func_ov00_02083614(s32 param_2) {} bool MapManager::GetEntrancePos(Vec3p *param_2, unk32 entranceId) {} bool MapManager::func_ov00_02083664(Vec3p *param_2, unk32 entranceId) {} s32 MapManager::func_ov00_020836bc(u32 param_2, unk32 *param_3) {} -u32 MapManager::func_ov00_020836cc(u32 param_2, AABB *param_3, u32 param_4) {} +s32 MapManager::GetTriggerBoundingBoxes(u32 param_2, AABB *param_3, u32 param_4) {} unk8 MapManager::func_ov00_020836dc(unk32 param_2, unk32 param_3) {} bool MapManager::func_ov00_02083770(u32 param_2, unk32 param_3) {} bool MapManager::func_ov00_02083780(unk32 param_2) {}