diff options
| author | savage13 <savage13@gmail.com> | 2022-02-19 07:32:13 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-19 13:32:13 +0100 |
| commit | 4e21ee7613e08cf59e7504844568f7eea067dde8 (patch) | |
| tree | 3f74cdf9baaaf5e2c15ad9e3a74548461e27f832 /src/Game/Actor/actDragon.cpp | |
| parent | bf611b1856fa90c6acf92ef279084edbbaed542a (diff) | |
getDragonItemDropPosition (#84)
getDragonItemDropPosition - NON_MATCHING fadd arguments mismatch
Diffstat (limited to 'src/Game/Actor/actDragon.cpp')
| -rw-r--r-- | src/Game/Actor/actDragon.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/Game/Actor/actDragon.cpp b/src/Game/Actor/actDragon.cpp new file mode 100644 index 00000000..5b0ee3c2 --- /dev/null +++ b/src/Game/Actor/actDragon.cpp @@ -0,0 +1,50 @@ +#include "Game/Actor/actDragon.h" +#include <math/seadVector.h> +#include <random/seadGlobalRandom.h> +#include "KingSystem/Map/mapObject.h" +#include "KingSystem/Map/mapPlacementMgr.h" + +namespace uking::act { + +inline float sqXYZDistance(const sead::Vector3f& a, const sead::Vector3f& b) { + sead::Vector3f diff = a; + diff -= b; + return diff.squaredLength(); +} + +// NON_MATCHING: Swapped arguments in fadd for distance calcuation +bool getDragonItemDropPosition(sead::Vector3f* target_pos, const sead::Vector3f& current_pos) { + auto* mgr = ksys::map::PlacementMgr::instance(); + const auto& results = mgr->mTraverseResults[1 - mgr->mTraverseResultIdx]; + + sead::SafeArray<sead::Vector3f, 3> pos; + pos.fill(sead::Vector3f::zero); + + bool ok = false; + for (const auto& obj : results.dragon_item_drop_targets) { + const sead::Vector3f& obj_pos = obj.getTranslate(); + if (!(obj_pos.y < current_pos.y)) { + continue; + } + + // Looks like an Insertion Sort + for (int i = 0; i < pos.size(); i++) { + bool closer = sqXYZDistance(obj_pos, current_pos) < sqXYZDistance(pos[i], current_pos); + if (closer || pos[i] == sead::Vector3f(0, 0, 0)) { + if (i > 0) { + pos[i - 1] = pos[i]; + } + pos[i] = obj_pos; + ok = true; + } + } + } + if (!ok) { + return false; + } + int index = sead::GlobalRandom::instance()->getS32Range(0, 3); + target_pos->e = pos[index].e; + return true; +} + +} // namespace uking::act |
