diff options
| author | Léo Lam <leo@leolam.fr> | 2020-12-17 23:14:09 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2020-12-19 20:37:37 +0100 |
| commit | 8a22f0bb50bbe3aa7973d80ff1e4cc62c369f9a3 (patch) | |
| tree | d673cb1c59c98357be0779e70a69f08300ef8885 /src/KingSystem/ActorSystem/actAiActionBase.cpp | |
| parent | cd6bf1e82170328a1c68c515ce438f5ed977a246 (diff) | |
ksys/act: Add more ActionBase, Ai and RootAi functions
Diffstat (limited to 'src/KingSystem/ActorSystem/actAiActionBase.cpp')
| -rw-r--r-- | src/KingSystem/ActorSystem/actAiActionBase.cpp | 151 |
1 files changed, 146 insertions, 5 deletions
diff --git a/src/KingSystem/ActorSystem/actAiActionBase.cpp b/src/KingSystem/ActorSystem/actAiActionBase.cpp index 05d7e952..6de513f2 100644 --- a/src/KingSystem/ActorSystem/actAiActionBase.cpp +++ b/src/KingSystem/ActorSystem/actAiActionBase.cpp @@ -1,7 +1,10 @@ #include "KingSystem/ActorSystem/actAiActionBase.h" #include "KingSystem/ActorSystem/actActorParam.h" +#include "KingSystem/ActorSystem/actAiAction.h" #include "KingSystem/ActorSystem/actAiRoot.h" #include "KingSystem/Resource/resResourceAIProgram.h" +#include "KingSystem/Utils/InitTimeInfo.h" +#include "KingSystem/ActorSystem/actActor.h" namespace ksys::act::ai { @@ -12,6 +15,10 @@ inline res::AIProgram* ActionBase::getAIProg() const { return mActor->getParam()->getRes().mAIProgram; } +inline auto& ActionBase::getDef() const { + return getAIProg()->getAction(getType(), mDefinitionIdx); +} + bool ActionBase::init(sead::Heap* heap, bool skip_loading_map_or_tree_params) { initFlags(getAIProg(), mDefinitionIdx, getType()); @@ -60,7 +67,7 @@ const char* ActionBase::getClassName() const { return getDefaultName(getType(), mRootIdx); } - return getAIProg()->getAction(getType(), mDefinitionIdx).mClassName; + return getDef().mClassName; } bool ActionBase::isRootAiParamINot5() const { @@ -89,7 +96,7 @@ void ActionBase::enter(InlineParamPack* params, const sead::SafeString& context) const char* ActionBase::getName() const { if (mDefinitionIdx >= 0) - return getAIProg()->getAction(getType(), mDefinitionIdx).mName; + return getDef().mName; if (mRootIdx >= 0) return getDefaultName(getType(), mRootIdx); @@ -107,7 +114,7 @@ void ActionBase::updateBehaviorsOnEnter() { return; indices = &getAIProg()->getDemoBehaviorIndices(); } else { - indices = &getAIProg()->getAction(getType(), mDefinitionIdx).mBehaviorIndices; + indices = &getDef().mBehaviorIndices; } auto* root = mActor->getRootAi(); @@ -166,7 +173,7 @@ void ActionBase::leave() { postLeave(); } -void ActionBase::setRootAiFlagBit(int bit) { +void ActionBase::setRootAiFlagBit(int bit) const { mActor->getRootAi()->_16c.set(RootAiFlag(1u << bit)); } @@ -188,7 +195,7 @@ void ActionBase::updateBehaviorsOnLeave() { return; indices = &getAIProg()->getDemoBehaviorIndices(); } else { - indices = &getAIProg()->getAction(getType(), mDefinitionIdx).mBehaviorIndices; + indices = &getDef().mBehaviorIndices; } auto* root = mActor->getRootAi(); @@ -202,6 +209,20 @@ bool ActionBase::oneShot(InlineParamPack* params) { return oneShot_(); } +res::GParamList* ActionBase::getGParamList() const { + return mActor->getParam()->getRes().mGParamList; +} + +Action* ActionBase::getCurrentAction() { + auto action = std::ref(*this); + while (true) { + auto* next = action.get().getCurrentChild(); + if (!next) + return sead::DynamicCast<Action>(&action.get()); + action = *next; + } +} + void ActionBase::setFinished() { mFlags.set(Flag::Finished); mFlags.reset(Flag::Failed); @@ -212,4 +233,124 @@ void ActionBase::setFailed() { mFlags.reset(Flag::Finished); } +void ActionBase::getCurrentName(sead::BufferedSafeString* name, ActionBase* last) const { + if (!sead::IsDerivedFrom<RootAi>(this)) + name->appendWithFormat("/%s", getName()); + + if (this != last && getCurrentChild()) + getCurrentChild()->getCurrentName(name, last); +} + +void ActionBase::getParams(ParamNameTypePairs* pairs, bool update_use_count) const { + mParams.getPairs(pairs, update_use_count); +} + +void ActionBase::resetRootAiFlagBit(int bit) const { + mActor->getRootAi()->_16c.reset(RootAiFlag(1u << bit)); +} + +bool ActionBase::testRootAiFlag2Bit(int bit) const { + return mActor->getRootAi()->_16e.isOn(RootAiFlag2(1u << bit)); +} + +template <typename T> +bool ActionBase::getStaticParam(T* value, const sead::SafeString& key) const { + return getAIProg()->getSInstParam(value, getDef(), key); +} + +template bool ActionBase::getStaticParam(const char**, const sead::SafeString&) const; +template bool ActionBase::getStaticParam(sead::SafeString*, const sead::SafeString&) const; +template bool ActionBase::getStaticParam(const int**, const sead::SafeString&) const; +template bool ActionBase::getStaticParam(const float**, const sead::SafeString&) const; +template bool ActionBase::getStaticParam(const sead::Vector3f**, const sead::SafeString&) const; +template bool ActionBase::getStaticParam(const bool**, const sead::SafeString&) const; + +void ActionBase::logMissingParam(const sead::SafeString& param) const { + // Stubbed in release versions + const auto type = getType(); + static_cast<void>(type); +} + +template <typename T> +bool ActionBase::getMapUnitParam(T* value, const sead::SafeString& key) const { + return mActor->getRootAi()->getMapUnitParam(value, key); +} + +template bool ActionBase::getMapUnitParam(sead::SafeString*, const sead::SafeString&) const; +template bool ActionBase::getMapUnitParam(const int**, const sead::SafeString&) const; +template bool ActionBase::getMapUnitParam(const float**, const sead::SafeString&) const; +template bool ActionBase::getMapUnitParam(const sead::Vector3f**, const sead::SafeString&) const; +template bool ActionBase::getMapUnitParam(const bool**, const sead::SafeString&) const; + +template <typename T> +bool ActionBase::getAITreeVariable(T** value, const sead::SafeString& key) const { + return mActor->getRootAi()->getAITreeVariable(value, key); +} + +template bool ActionBase::getAITreeVariable(sead::SafeString**, const sead::SafeString&) const; +template bool ActionBase::getAITreeVariable(s32**, const sead::SafeString&) const; +template bool ActionBase::getAITreeVariable(f32**, const sead::SafeString&) const; +template bool ActionBase::getAITreeVariable(sead::Vector3f**, const sead::SafeString&) const; +template bool ActionBase::getAITreeVariable(bool**, const sead::SafeString&) const; +template bool ActionBase::getAITreeVariable(void**, const sead::SafeString&) const; + +namespace { + +BaseProcLink sDefaultBaseProcLink; +sead::FixedSafeString<32> sDefaultString32; +int sDefaultInt; +float sDefaultFloat; +bool sDefaultBool; +Rail* sDefaultRail; +struct ComplexDefaults { + util::InitConstants init_constants; + BaseProcHandle* base_proc_handle; + sead::Vector3f vec3{0, 0, 0}; + sead::SafeString string; + mes::TransceiverId transceiver_id; +}; +ComplexDefaults sDefaults; + +} // namespace + +sead::SafeString* getDefaultString() { + return &sDefaults.string; +} + +s32* getDefaultInt() { + return &sDefaultInt; +} + +f32* getDefaultFloat() { + return &sDefaultFloat; +} + +sead::Vector3f* getDefaultVec3() { + return &sDefaults.vec3; +} + +bool* getDefaultBool() { + return &sDefaultBool; +} + +BaseProcLink* getDefaultBaseProcLink() { + return &sDefaultBaseProcLink; +} + +mes::TransceiverId* getDefaultMesTransceiverId() { + return &sDefaults.transceiver_id; +} + +BaseProcHandle** getDefaultBaseProcHandle() { + return &sDefaults.base_proc_handle; +} + +Rail** getDefaultRail() { + return &sDefaultRail; +} + +sead::FixedSafeString<32>* getDefaultString32() { + return &sDefaultString32; +} + } // namespace ksys::act::ai |
