summaryrefslogtreecommitdiff
path: root/engine-ocean/Game/Systems/AI/Conditions/proximitycondition.cpp
blob: 2e40ce7ffc9659a48fb4b43444ad0ab3c3605cb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "proximitycondition.h"
#include "Game/Components/TransformComponent.h"
#include "glm/glm.hpp"
#include <memory>

ProximityCondition::ProximityCondition(std::string entity_id,
                                       std::map<std::string, BlackboardData>& global_blackboard,
                                       float proximity):
    m_global_blackboard(global_blackboard)
{
    m_proximity = proximity;
    m_entity_id = entity_id;
    // initialize just in case
    m_global_blackboard["player"].conditionData["isJumping"].conditionTrue = false;


}

// maybe can check locations from blackboard
// pass blackboard into constructor
// struct: positiondata --> getCurrentPos, setCurrentPos
bool ProximityCondition::checkProximity(){
    // unrooted distance
    glm::vec3 aiPos = m_global_blackboard[m_entity_id].locationData.currPos;
    glm::vec3 otherPos = m_global_blackboard["player"].locationData.currPos;
    float distance = pow(aiPos.x-otherPos.x, 2) + pow(aiPos.y-otherPos.y, 2) + pow(aiPos.z-otherPos.z, 2);

    if (distance <= m_proximity) return true;
    return false;
}

// at every update, check if AIPos is near otherPos
Status ProximityCondition::update(float seconds){
    // while entity is still pathfinding, keep returning success
    if (m_global_blackboard[m_entity_id].conditionData["isPathfinding"].conditionTrue) return Status::SUCCESS;
    if (checkProximity() && m_global_blackboard["player"].conditionData["isJumping"].conditionTrue) return Status::SUCCESS;

    return Status::FAIL;
}


void ProximityCondition::reset(){}
void ProximityCondition::addChildren(BTNode *node){}