From 4e21ee7613e08cf59e7504844568f7eea067dde8 Mon Sep 17 00:00:00 2001 From: savage13 Date: Sat, 19 Feb 2022 07:32:13 -0500 Subject: [PATCH] getDragonItemDropPosition (#84) getDragonItemDropPosition - NON_MATCHING fadd arguments mismatch --- data/uking_functions.csv | 2 +- src/Game/Actor/CMakeLists.txt | 2 ++ src/Game/Actor/actDragon.cpp | 50 ++++++++++++++++++++++++++++ src/Game/Actor/actDragon.h | 6 ++++ src/KingSystem/Map/mapPlacementMgr.h | 2 +- 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/Game/Actor/actDragon.cpp create mode 100644 src/Game/Actor/actDragon.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 742257da..2722a676 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -410,7 +410,7 @@ Address,Quality,Size,Name 0x000000710000ae74,U,000048, 0x000000710000aea4,U,000040, 0x000000710000aecc,U,000120,dragon::isWithin1kmOfHyruleCastle -0x000000710000af44,U,000720,getDragonItemDropPosition +0x000000710000af44,m,000720,_ZN5uking3act25getDragonItemDropPositionEPN4sead7Vector3IfEERKS3_ 0x000000710000b214,U,001276,Dragon::ctor 0x000000710000b710,U,000672, 0x000000710000b9b0,U,000648, 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 +#include +#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 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 + +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 _30; sead::PtrArray _40; sead::PtrArray _50; - sead::PtrArray dragon_item_drop_targets; + sead::PtrArray dragon_item_drop_targets; sead::PtrArray _70; }; KSYS_CHECK_SIZE_NX150(TraverseResults, 0x80);