diff options
| author | Léo Lam <leo@leolam.fr> | 2026-09-14 00:02:22 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2026-09-14 00:02:22 +0200 |
| commit | f4cd38c43b436fe91def1a1b0b3dfe0134369870 (patch) | |
| tree | 1ab07eab2ea43c0719d6b1309743715bd80cd408 /src/Game/Actor/Action/actionAddAutoPlacementCreator.cpp | |
| parent | 5b26254bfe69560b0993a50d8ba8f418ae749380 (diff) | |
Actor: move all AI code under Game/Actor
Link order shows one sorted actor tree, not a separate AI project: the
Action/AI/Query folders and per-feature folders (Camera, Player, Horse,
...) come out of the same archive rounds as the actor classes.
(AI assisted using Claude Fable 5.1 and Claude Opus 5.5)
Diffstat (limited to 'src/Game/Actor/Action/actionAddAutoPlacementCreator.cpp')
| -rw-r--r-- | src/Game/Actor/Action/actionAddAutoPlacementCreator.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/Game/Actor/Action/actionAddAutoPlacementCreator.cpp b/src/Game/Actor/Action/actionAddAutoPlacementCreator.cpp new file mode 100644 index 00000000..086fb095 --- /dev/null +++ b/src/Game/Actor/Action/actionAddAutoPlacementCreator.cpp @@ -0,0 +1,76 @@ +#include "Game/Actor/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 { + +AddAutoPlacementCreator::AddAutoPlacementCreator(const InitArg& arg) : ksys::act::ai::Action(arg) {} + +AddAutoPlacementCreator::~AddAutoPlacementCreator() = default; + +bool AddAutoPlacementCreator::init_(sead::Heap* heap) { + return ksys::act::ai::Action::init_(heap); +} + +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_() { + getMapUnitParam(&mCount_m, "Count"); + getMapUnitParam(&mActorName_m, "ActorName"); + getMapUnitParam(&mShape_m, "Shape"); +} + +void AddAutoPlacementCreator::calc_() { + ksys::act::ai::Action::calc_(); +} + +} // namespace uking::action |
