diff options
Diffstat (limited to 'src/Mobs/Behaviors/BehaviorChaser.cpp')
-rw-r--r-- | src/Mobs/Behaviors/BehaviorChaser.cpp | 160 |
1 files changed, 79 insertions, 81 deletions
diff --git a/src/Mobs/Behaviors/BehaviorChaser.cpp b/src/Mobs/Behaviors/BehaviorChaser.cpp index b022495eb..2cdafe98f 100644 --- a/src/Mobs/Behaviors/BehaviorChaser.cpp +++ b/src/Mobs/Behaviors/BehaviorChaser.cpp @@ -10,58 +10,62 @@ cBehaviorChaser::cBehaviorChaser(cMonster * a_Parent) : - m_Parent(a_Parent) + m_Parent(a_Parent) , m_AttackRate(3) , m_AttackDamage(1) , m_AttackRange(1) , m_AttackCoolDownTicksLeft(0) , m_TicksSinceLastDamaged(50) { - ASSERT(m_Parent != nullptr); - m_StrikeBehavior = m_Parent->GetBehaviorStriker(); - ASSERT(m_StrikeBehavior != nullptr); // The monster that has an Attacker behavior must also have a Striker behavior + ASSERT(m_Parent != nullptr); } -bool cBehaviorChaser::ActiveTick() +bool cBehaviorChaser::Tick() { - // Stop targeting out of range targets - if (GetTarget() != nullptr) - { - if (TargetOutOfSight()) - { - SetTarget(nullptr); - } - else - { - if (TargetIsInStrikeRange()) - { - StrikeTarget(); - } - else - { - ApproachTarget(); - } - return true; - } - } - return false; + // Stop targeting out of range targets + if (GetTarget() != nullptr) + { + if (TargetOutOfSight()) + { + SetTarget(nullptr); + } + else + { + if (TargetIsInStrikeRange()) + { + StrikeTarget(); + } + else + { + ApproachTarget(); // potential mobTodo: decoupling approaching from attacking + // Not important now, but important for future extensibility, e.g. + // cow chases wheat but using the netherman approacher to teleport around. + } + return true; + } + } + return false; } +void cBehaviorChaser::ApproachTarget() +{ + // potential mobTodo inheritence for creaper approachers, etc + m_Parent->MoveToPosition(m_Target->GetPosition()); +} - -void cBehaviorChaser::Tick() +void cBehaviorChaser::PostTick() { - ++m_TicksSinceLastDamaged; - if (m_AttackCoolDownTicksLeft > 0) - { - m_AttackCoolDownTicksLeft -= 1; - } + ++m_TicksSinceLastDamaged; + if (m_AttackCoolDownTicksLeft > 0) + { + m_AttackCoolDownTicksLeft -= 1; + } } @@ -70,7 +74,7 @@ void cBehaviorChaser::Tick() void cBehaviorChaser::Destroyed() { - m_Target = nullptr; + SetTarget(nullptr); } @@ -79,7 +83,7 @@ void cBehaviorChaser::Destroyed() void cBehaviorChaser::SetAttackRate(float a_AttackRate) { - m_AttackRate = a_AttackRate; + m_AttackRate = a_AttackRate; } @@ -88,7 +92,7 @@ void cBehaviorChaser::SetAttackRate(float a_AttackRate) void cBehaviorChaser::SetAttackRange(int a_AttackRange) { - m_AttackRange = a_AttackRange; + m_AttackRange = a_AttackRange; } @@ -97,7 +101,7 @@ void cBehaviorChaser::SetAttackRange(int a_AttackRange) void cBehaviorChaser::SetAttackDamage(int a_AttackDamage) { - m_AttackDamage = a_AttackDamage; + m_AttackDamage = a_AttackDamage; } @@ -105,7 +109,7 @@ void cBehaviorChaser::SetAttackDamage(int a_AttackDamage) cPawn * cBehaviorChaser::GetTarget() { - return m_Target; + return m_Target; } @@ -114,16 +118,7 @@ cPawn * cBehaviorChaser::GetTarget() void cBehaviorChaser::SetTarget(cPawn * a_Target) { - m_Target = a_Target; -} - - - - - -cBehaviorChaser::~cBehaviorChaser() -{ - + m_Target = a_Target; } @@ -132,26 +127,26 @@ cBehaviorChaser::~cBehaviorChaser() bool cBehaviorChaser::TargetIsInStrikeRange() { - ASSERT(m_Target != nullptr); - ASSERT(m_Parent != nullptr); - /* - #include "../../Tracer.h" - cTracer LineOfSight(m_Parent->GetWorld()); - Vector3d MyHeadPosition = m_Parent->GetPosition() + Vector3d(0, m_Parent->GetHeight(), 0); - Vector3d AttackDirection(m_ParentChaser->GetTarget()->GetPosition() + Vector3d(0, GetTarget()->GetHeight(), 0) - MyHeadPosition); - - - if (GetTarget() != nullptr) - { - MoveToPosition(GetTarget()->GetPosition()); - } - if (TargetIsInRange() && !LineOfSight.Trace(MyHeadPosition, AttackDirection, static_cast<int>(AttackDirection.Length())) && (GetHealth() > 0.0)) - { - // Attack if reached destination, target isn't null, and have a clear line of sight to target (so won't attack through walls) - Attack(a_Dt); - } - */ - return ((m_Target->GetPosition() - m_Parent->GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); + ASSERT(m_Target != nullptr); + ASSERT(m_Parent != nullptr); + /* + #include "../../Tracer.h" + cTracer LineOfSight(m_Parent->GetWorld()); + Vector3d MyHeadPosition = m_Parent->GetPosition() + Vector3d(0, m_Parent->GetHeight(), 0); + Vector3d AttackDirection(m_ParentChaser->GetTarget()->GetPosition() + Vector3d(0, GetTarget()->GetHeight(), 0) - MyHeadPosition); + + + if (GetTarget() != nullptr) + { + MoveToPosition(GetTarget()->GetPosition()); + } + if (TargetIsInRange() && !LineOfSight.Trace(MyHeadPosition, AttackDirection, static_cast<int>(AttackDirection.Length())) && (GetHealth() > 0.0)) + { + // Attack if reached destination, target isn't null, and have a clear line of sight to target (so won't attack through walls) + Attack(a_Dt); + } + */ + return ((m_Target->GetPosition() - m_Parent->GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange)); } @@ -160,12 +155,12 @@ bool cBehaviorChaser::TargetIsInStrikeRange() bool cBehaviorChaser::TargetOutOfSight() { - ASSERT(m_Target != nullptr); - if ((GetTarget()->GetPosition() - m_Parent->GetPosition()).Length() > m_Parent->GetSightDistance()) - { - return true; - } - return false; + ASSERT(m_Target != nullptr); + if ((GetTarget()->GetPosition() - m_Parent->GetPosition()).Length() > m_Parent->GetSightDistance()) + { + return true; + } + return false; } @@ -174,7 +169,7 @@ bool cBehaviorChaser::TargetOutOfSight() void cBehaviorChaser::ResetStrikeCooldown() { - m_AttackCoolDownTicksLeft = static_cast<int>(3 * 20 * m_AttackRate); // A second has 20 ticks, an attack rate of 1 means 1 hit every 3 seconds + m_AttackCoolDownTicksLeft = static_cast<int>(3 * 20 * m_AttackRate); // A second has 20 ticks, an attack rate of 1 means 1 hit every 3 seconds } @@ -183,10 +178,13 @@ void cBehaviorChaser::ResetStrikeCooldown() void cBehaviorChaser::StrikeTarget() { - if (m_AttackCoolDownTicksLeft != 0) - { - // mobTodo - // m_StrikeBehavior->Strike(m_Target); // LogicParrot Todo animations (via counter passing?) - ResetStrikeCooldown(); - } + if (m_AttackCoolDownTicksLeft != 0) + { + cBehaviorStriker * Striker = m_Parent->GetBehaviorStriker(); + if (Striker != nullptr) + { + Striker->Strike(m_Target); + } + ResetStrikeCooldown(); + } } |