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 | |
| parent | bf611b1856fa90c6acf92ef279084edbbaed542a (diff) | |
getDragonItemDropPosition (#84)
getDragonItemDropPosition - NON_MATCHING fadd arguments mismatch
Diffstat (limited to 'src')
| -rw-r--r-- | src/Game/Actor/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/Game/Actor/actDragon.cpp | 50 | ||||
| -rw-r--r-- | src/Game/Actor/actDragon.h | 6 | ||||
| -rw-r--r-- | src/KingSystem/Map/mapPlacementMgr.h | 2 |
4 files changed, 59 insertions, 1 deletions
diff --git a/src/Game/Actor/CMakeLists.txt b/src/Game/Actor/CMakeLists.txt index 08ef56ef..a1f3d648 100644 --- a/src/Game/Actor/CMakeLists.txt +++ b/src/Game/Actor/CMakeLists.txt @@ -1,4 +1,6 @@ target_sources(uking PRIVATE + actDragon.cpp + actDragon.h actWeapon.cpp actWeapon.h ) 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 diff --git a/src/Game/Actor/actDragon.h b/src/Game/Actor/actDragon.h new file mode 100644 index 00000000..1e2b4249 --- /dev/null +++ b/src/Game/Actor/actDragon.h @@ -0,0 +1,6 @@ +#pragma once +#include <math/seadVector.h> + +namespace uking::act { +bool getDragonItemDropPosition(sead::Vector3f* target_pos, const sead::Vector3f& current_pos); +} diff --git a/src/KingSystem/Map/mapPlacementMgr.h b/src/KingSystem/Map/mapPlacementMgr.h index 56db40ed..b8956d3d 100644 --- a/src/KingSystem/Map/mapPlacementMgr.h +++ b/src/KingSystem/Map/mapPlacementMgr.h @@ -33,7 +33,7 @@ class PlacementMgr { sead::PtrArray<u32> _30; sead::PtrArray<u32> _40; sead::PtrArray<u32> _50; - sead::PtrArray<u32> dragon_item_drop_targets; + sead::PtrArray<map::Object> dragon_item_drop_targets; sead::PtrArray<u32> _70; }; KSYS_CHECK_SIZE_NX150(TraverseResults, 0x80); |
