summaryrefslogtreecommitdiff
path: root/src/Game/Actor/actDragon.cpp
diff options
context:
space:
mode:
authorsavage13 <savage13@gmail.com>2022-02-19 07:32:13 -0500
committerGitHub <noreply@github.com>2022-02-19 13:32:13 +0100
commit4e21ee7613e08cf59e7504844568f7eea067dde8 (patch)
tree3f74cdf9baaaf5e2c15ad9e3a74548461e27f832 /src/Game/Actor/actDragon.cpp
parentbf611b1856fa90c6acf92ef279084edbbaed542a (diff)
getDragonItemDropPosition (#84)
getDragonItemDropPosition - NON_MATCHING fadd arguments mismatch
Diffstat (limited to 'src/Game/Actor/actDragon.cpp')
-rw-r--r--src/Game/Actor/actDragon.cpp50
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