#pragma once #include #include #include struct BehaviorVar { struct Replacer { uint64_t origHash; uint64_t newHash; TiltedPhoques::String signatureVar; TiltedPhoques::String creatureName; TiltedPhoques::Vector syncBooleanVar; TiltedPhoques::Vector syncFloatVar; TiltedPhoques::Vector syncIntegerVar; bool operator==(const uint64_t& acRHS) const { return origHash == acRHS; } }; static BehaviorVar* Get(); const AnimationGraphDescriptor* Patch(BSAnimationGraphManager* apManager, Actor* apActor); bool FailListed(const uint64_t acHash); void FailList(const uint64_t acHash); static const bool IsDragon(const uint64_t acHash) { return acHash == Get()->m_dragonGraphDescriptorHash; } static const uint64_t GetHumanoidHash() { return Get()->m_humanoidGraphDescriptorHash; } void Init(); void Debug(); private: static BehaviorVar* single; uint64_t invocations = 0; // These start out with the unmodded hashes and save the modded // hash if behavior is modified. Humanoid is used to return from // beast mode, and dragon is used for IsDragon() test. uint64_t m_humanoidGraphDescriptorHash {AnimationGraphDescriptor_Master_Behavior::m_key}; uint64_t m_dragonGraphDescriptorHash {AnimationGraphDescriptor_BHR_Master::m_key}; void SeedAnimationVariables( const uint64_t acHash, const AnimationGraphDescriptor* acpDescriptor, TiltedPhoques::Map& acReverseMap, TiltedPhoques::Set& aBoolVars, TiltedPhoques::Set& aFloatVars, TiltedPhoques::Set& aIntVars); const TiltedPhoques::Vector TokenizeBehaviorSig(const TiltedPhoques::String& acSignature) const; const AnimationGraphDescriptor* ConstructModdedDescriptor( const uint64_t acNewHash, const Replacer& acReplacer, TiltedPhoques::Map& acReverseMap); TiltedPhoques::Vector LoadDirs(const std::filesystem::path& acPath); Replacer* LoadReplacerFromDir(const std::filesystem::path& acDir); TiltedPhoques::Vector SignatureMatches(const uint64_t acHash, const TiltedPhoques::String& acSignature) const; TiltedPhoques::Vector behaviorPool; // Pool for loaded behaviors TiltedPhoques::Map failedBehaviors; }; extern const AnimationGraphDescriptor* BehaviorVarPatch(BSAnimationGraphManager* apManager, Actor* apActor);