diff --git a/hsm/limbo_hsm.cpp b/hsm/limbo_hsm.cpp index 07ff329..53289e3 100644 --- a/hsm/limbo_hsm.cpp +++ b/hsm/limbo_hsm.cpp @@ -119,7 +119,7 @@ void LimboHSM::remove_transition(LimboState *p_from_state, const StringName &p_e transitions.erase(key); } -void LimboHSM::get_transition(LimboState *p_from_state, const StringName &p_event, Transition &r_transition) const { +void LimboHSM::_get_transition(LimboState *p_from_state, const StringName &p_event, Transition &r_transition) const { ERR_FAIL_COND_MSG(p_from_state != nullptr && p_from_state->get_parent() != this, "LimboHSM: Unable to get a transition from a state that is not an immediate child of this HSM."); ERR_FAIL_COND_MSG(p_event == StringName(), "LimboHSM: Unable to get a transition with an empty event string."); @@ -163,13 +163,13 @@ bool LimboHSM::_dispatch(const StringName &p_event, const Variant &p_cargo) { LimboState *to_state = nullptr; Transition transition; - get_transition(active_state, p_event, transition); + _get_transition(active_state, p_event, transition); if (transition.is_valid()) { to_state = Object::cast_to(ObjectDB::get_instance(transition.to_state)); } if (to_state == nullptr) { // Get ANYSTATE transition. - get_transition(nullptr, p_event, transition); + _get_transition(nullptr, p_event, transition); if (transition.is_valid()) { to_state = Object::cast_to(ObjectDB::get_instance(transition.to_state)); if (to_state == active_state) { diff --git a/hsm/limbo_hsm.h b/hsm/limbo_hsm.h index dc8cfe7..57606d3 100644 --- a/hsm/limbo_hsm.h +++ b/hsm/limbo_hsm.h @@ -16,14 +16,6 @@ #define TransitionKey Pair -struct TransitionKeyHasher { - static uint32_t hash(const TransitionKey &P) { - uint64_t h1 = HashMapHasherDefault::hash(P.first); - uint64_t h2 = HashMapHasherDefault::hash(P.second); - return hash_one_uint64((h1 << 32) | h2); - } -}; - class LimboHSM : public LimboState { GDCLASS(LimboHSM, LimboState); @@ -35,6 +27,14 @@ public: }; private: + struct TransitionKeyHasher { + static uint32_t hash(const TransitionKey &P) { + uint64_t h1 = HashMapHasherDefault::hash(P.first); + uint64_t h2 = HashMapHasherDefault::hash(P.second); + return hash_one_uint64((h1 << 32) | h2); + } + }; + struct Transition { ObjectID from_state; ObjectID to_state; @@ -58,6 +58,8 @@ private: HashMap transitions; + void _get_transition(LimboState *p_from_state, const StringName &p_event, Transition &r_transition) const; + protected: static void _bind_methods(); @@ -92,7 +94,6 @@ public: void add_transition(LimboState *p_from_state, LimboState *p_to_state, const StringName &p_event); void remove_transition(LimboState *p_from_state, const StringName &p_event); bool has_transition(LimboState *p_from_state, const StringName &p_event) const { return transitions.has(Transition::make_key(p_from_state, p_event)); } - void get_transition(LimboState *p_from_state, const StringName &p_event, Transition &r_transition) const; LimboState *anystate() const { return nullptr; }