AddAutoPlacementCreator action

This commit is contained in:
theo3 2022-03-12 11:48:16 -08:00
parent 4758d41d69
commit 20f0a07ab0
6 changed files with 86 additions and 3 deletions

View File

@ -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

Can't render this file because it is too large.

View File

@ -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_() {

View File

@ -24,6 +24,8 @@ protected:
sead::SafeString mActorName_m{};
// map_unit_param at offset 0x38
sead::SafeString mShape_m{};
bool mInitialised{};
};
} // namespace uking::action

View File

@ -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);

View File

@ -0,0 +1,22 @@
#pragma once
#include <heap/seadDisposer.h>
#include <prim/seadSafeString.h>
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

View File

@ -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