diff options
Diffstat (limited to '')
-rw-r--r-- | src/Mobs/Monster.cpp | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index ae2d601cc..bf6eda50c 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -332,31 +332,37 @@ void cMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) // do not tick behaviors // mobTodo temporary leash special case. Needs a behavior eventually. } - else if (m_PinnedBehavior != nullptr) - { - // A behavior is pinned. We give it control automatically. - ASSERT(m_CurrentTickControllingBehavior == m_PinnedBehavior); - m_CurrentTickControllingBehavior->Tick(a_Dt, a_Chunk); - } else { - // ask the behaviors sequentially if they are interested in controlling this mob - // Stop at the first one that says yes. - m_NewTickControllingBehavior = nullptr; - for (cBehavior * Behavior : m_AttachedTickBehaviors) + // STEP 1: Decide who'll control us this tick + + if (m_PinnedBehavior != nullptr) + { + // A behavior is pinned. We give it control automatically. + m_NewTickControllingBehavior = m_PinnedBehavior; + } + else { - if (Behavior->IsControlDesired(a_Dt, a_Chunk)) + // ask the behaviors sequentially if they are interested in controlling this mob + // Stop at the first one that says yes. + m_NewTickControllingBehavior = nullptr; + for (cBehavior * Behavior : m_AttachedTickBehaviors) { - m_NewTickControllingBehavior = Behavior; - break; + if (Behavior->IsControlDesired(a_Dt, a_Chunk)) + { + m_NewTickControllingBehavior = Behavior; + break; + } } } ASSERT(m_NewTickControllingBehavior != nullptr); // it's not OK if no one asks for control + + // STEP 2: decide whether to tick or do behavior swapping + if (m_CurrentTickControllingBehavior == m_NewTickControllingBehavior) { // The Behavior asking for control is the same as the behavior from last tick. // Nothing special, just tick it. - // LOGD("mobDebug - Tick"); m_CurrentTickControllingBehavior->Tick(a_Dt, a_Chunk); } else if (m_CurrentTickControllingBehavior == nullptr) @@ -374,6 +380,8 @@ void cMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) } + // STEP 3: Behavior swapping if needed + // Make the current controlling behavior clean up if (m_TickControllingBehaviorState == OldControlEnding) { @@ -1359,9 +1367,7 @@ void cMonster::AttachDoTakeDamageBehavior(cBehavior * a_Behavior) void cMonster::PinBehavior(cBehavior * a_Behavior) { - ASSERT(m_TickControllingBehaviorState == Normal); m_PinnedBehavior = a_Behavior; - ASSERT(m_CurrentTickControllingBehavior == m_PinnedBehavior); } @@ -1370,8 +1376,7 @@ void cMonster::PinBehavior(cBehavior * a_Behavior) void cMonster::UnpinBehavior(cBehavior * a_Behavior) { - ASSERT(m_TickControllingBehaviorState == Normal); - ASSERT(m_PinnedBehavior = a_Behavior); + ASSERT(m_PinnedBehavior == a_Behavior); m_PinnedBehavior = nullptr; } |