From 20f0a07ab0b8f2945a479c4f368373403ce59e4d Mon Sep 17 00:00:00 2001 From: theo3 Date: Sat, 12 Mar 2022 11:48:16 -0800 Subject: [PATCH] AddAutoPlacementCreator action --- data/uking_functions.csv | 6 +-- .../Action/actionAddAutoPlacementCreator.cpp | 46 +++++++++++++++++++ .../AI/Action/actionAddAutoPlacementCreator.h | 2 + src/KingSystem/ActorSystem/actActor.h | 8 ++++ src/KingSystem/Map/mapAutoPlacementMgr.h | 22 +++++++++ src/KingSystem/Utils/MathUtil.h | 5 ++ 6 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 src/KingSystem/Map/mapAutoPlacementMgr.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index cac61200..231330bf 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -2474,13 +2474,13 @@ Address,Quality,Size,Name 0x000000710008298c,O,000256,_ZN5uking6action23ActorInfoToGameDataVec311loadParams_Ev 0x0000007100082a8c,O,000288,_ZNK5uking6action23ActorInfoToGameDataVec327checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x0000007100082bac,O,000092,_ZNK5uking6action23ActorInfoToGameDataVec318getRuntimeTypeInfoEv -0x0000007100082c08,U,000084,AI_Action_AddAutoPlacementCreator::ctor +0x0000007100082c08,O,000084,_ZN5uking6action23AddAutoPlacementCreatorC1ERKN4ksys3act2ai10ActionBase7InitArgE 0x0000007100082c5c,O,000020,_ZN5uking6action23AddAutoPlacementCreatorD1Ev 0x0000007100082c70,O,000052,_ZN5uking6action23AddAutoPlacementCreatorD0Ev 0x0000007100082ca4,O,000008,_ZN5uking6action23AddAutoPlacementCreator5init_EPN4sead4HeapE -0x0000007100082cac,U,000620,_ZN5uking6action23AddAutoPlacementCreator6enter_EPN4ksys3act2ai15InlineParamPackE +0x0000007100082cac,m,000620,_ZN5uking6action23AddAutoPlacementCreator6enter_EPN4ksys3act2ai15InlineParamPackE 0x0000007100082f18,O,000004,_ZN5uking6action23AddAutoPlacementCreator5calc_Ev -0x0000007100082f1c,U,000064,_ZN5uking6action23AddAutoPlacementCreator6leave_Ev +0x0000007100082f1c,O,000064,_ZN5uking6action23AddAutoPlacementCreator6leave_Ev 0x0000007100082f5c,O,000128,_ZN5uking6action23AddAutoPlacementCreator11loadParams_Ev 0x0000007100082fdc,O,000288,_ZNK5uking6action23AddAutoPlacementCreator27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071000830fc,O,000092,_ZNK5uking6action23AddAutoPlacementCreator18getRuntimeTypeInfoEv diff --git a/src/Game/AI/Action/actionAddAutoPlacementCreator.cpp b/src/Game/AI/Action/actionAddAutoPlacementCreator.cpp index be55bd67..7457b131 100644 --- a/src/Game/AI/Action/actionAddAutoPlacementCreator.cpp +++ b/src/Game/AI/Action/actionAddAutoPlacementCreator.cpp @@ -1,4 +1,8 @@ #include "Game/AI/Action/actionAddAutoPlacementCreator.h" +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/Map/mapAutoPlacementMgr.h" +#include "KingSystem/Map/mapDebug.h" +#include "KingSystem/Utils/MathUtil.h" namespace uking::action { @@ -10,12 +14,54 @@ bool AddAutoPlacementCreator::init_(sead::Heap* heap) { return ksys::act::ai::Action::init_(heap); } +// NON_MATCHING: dot float regalloc void AddAutoPlacementCreator::enter_(ksys::act::ai::InlineParamPack* params) { ksys::act::ai::Action::enter_(params); + + bool is_box = true; + + if (mInitialised) + return; + + ksys::act::Actor* actor = mActor; + + if (mShape_m == "Sphere") { + if (!sead::Mathf::equalsEpsilon(actor->getScale().x, actor->getScale().z, 0.01f)) { + ksys::map::printDebugMsg(actor, "スケールのXとZは一致していないといけません", nullptr); + return; + } + is_box = false; + } else if (mShape_m == "Box") { + is_box = true; + } else { + ksys::map::printDebugMsg(actor, "形状は球か箱以外無効です", nullptr); + return; + } + + if (!sead::Mathf::equalsEpsilon(ksys::util::dot(sead::Vector3f::ey, actor->getMtx(), 1), 1.0f, + 0.01f)) { + ksys::map::printDebugMsg(actor, "回転はY以外無効です", nullptr); + return; + } + + if (ksys::map::AutoPlacementMgr::instance() != nullptr && + ksys::map::AutoPlacementMgr::instance()->sub_7100659E40(mActor, mActorName_m, *mCount_m, + is_box)) { + actor->setDeleteDistance(actor->getDeleteDistance() + 100.0f); + mInitialised = true; + } } void AddAutoPlacementCreator::leave_() { ksys::act::ai::Action::leave_(); + + if (!mInitialised) + return; + + if (ksys::map::AutoPlacementMgr::instance() != nullptr) + ksys::map::AutoPlacementMgr::instance()->sub_7100659F94(mActor); + + mInitialised = false; } void AddAutoPlacementCreator::loadParams_() { diff --git a/src/Game/AI/Action/actionAddAutoPlacementCreator.h b/src/Game/AI/Action/actionAddAutoPlacementCreator.h index 4f717935..a9ccbc12 100644 --- a/src/Game/AI/Action/actionAddAutoPlacementCreator.h +++ b/src/Game/AI/Action/actionAddAutoPlacementCreator.h @@ -24,6 +24,8 @@ protected: sead::SafeString mActorName_m{}; // map_unit_param at offset 0x38 sead::SafeString mShape_m{}; + + bool mInitialised{}; }; } // namespace uking::action diff --git a/src/KingSystem/ActorSystem/actActor.h b/src/KingSystem/ActorSystem/actActor.h index 84e5eebb..da3e060e 100644 --- a/src/KingSystem/ActorSystem/actActor.h +++ b/src/KingSystem/ActorSystem/actActor.h @@ -136,6 +136,14 @@ public: map::Object* getMapObject() const { return mMapObject; } const map::MubinIter& getMapObjIter() const { return mMapObjIter; } + const sead::Matrix34f& getMtx() const { return mMtx; } + const sead::Vector3f& getVelocity() const { return mVelocity; } + const sead::Vector3f& getAngVelocity() const { return mAngVelocity; } + const sead::Vector3f& getScale() const { return mScale; } + f32 getDeleteDistance() const { return sead::Mathf::sqrt(sead::Mathf::clampMin(mDeleteDistanceSq, 0.0f)); } + + void setDeleteDistance(f32 distance) { mDeleteDistanceSq = sead::Mathf::square(distance); } + void clearFlag(ActorFlag flag); bool checkFlag(ActorFlag flag) const; void setFlag(ActorFlag flag); diff --git a/src/KingSystem/Map/mapAutoPlacementMgr.h b/src/KingSystem/Map/mapAutoPlacementMgr.h new file mode 100644 index 00000000..0fb8e722 --- /dev/null +++ b/src/KingSystem/Map/mapAutoPlacementMgr.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +namespace ksys::act { +class Actor; +} // namespace ksys::act + +namespace ksys::map { + +class AutoPlacementMgr { +SEAD_SINGLETON_DISPOSER(AutoPlacementMgr) +public: + AutoPlacementMgr(); + virtual ~AutoPlacementMgr(); + + bool sub_7100659E40(ksys::act::Actor* actor, const sead::SafeString& actor_name, int count, bool is_box); + void sub_7100659F94(ksys::act::Actor* actor); +}; + +} // namespace ksys::map diff --git a/src/KingSystem/Utils/MathUtil.h b/src/KingSystem/Utils/MathUtil.h index 182bbe2c..d7158213 100644 --- a/src/KingSystem/Utils/MathUtil.h +++ b/src/KingSystem/Utils/MathUtil.h @@ -21,4 +21,9 @@ inline float sqXZDistance(const sead::Vector3f& a, const sead::Vector3f& b) { return sead::Mathf::square(a.x - b.x) + sead::Mathf::square(a.z - b.z); } +// NON_MATCHING: float regalloc +inline float dot(const sead::Vector3f& u, const sead::Matrix34f& mtx, int row) { + return u.x * mtx(row, 0) + u.y * mtx(row, 1) + mtx(row, 2) * u.z; +} + } // namespace ksys::util