summaryrefslogtreecommitdiff
path: root/engine-ocean/Game/Systems/AI/Actions/walkaction.cpp
blob: 6a6d11674c57b6715648bdd83dc858abb3242d1a (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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "walkaction.h"
#include "Game/Components/PathfindComponent.h"
#include "Game/Components/TransformComponent.h"
#include "Game/GameObjects/GameObject.h"
#include "glm/glm.hpp"
#include <memory>


WalkAction::WalkAction(std::string entity_id,
                       std::map<std::string, BlackboardData>& global_blackboard):
    m_global_blackboard(global_blackboard)
{

    m_entity_id = entity_id;
    m_path.clear();

    m_global_blackboard[m_entity_id].conditionData["isPathfinding"].conditionTrue = false;
    m_global_blackboard[m_entity_id].conditionData["atDestination"].conditionTrue = false;
    m_global_blackboard[m_entity_id].conditionData["pathfound"].conditionTrue = false;




}

void WalkAction::setPath(glm::vec3 entity_pos){
    std::cout << "---------SETTING PATHH" << std::endl;
    m_destination = m_global_blackboard["player"].locationData.currPos;
    m_path = m_global_blackboard["navmesh"].environment->getComponent<PathfindComponent>()->getPath(glm::vec3(-0.58249, 0, -0.0210782), glm::vec3(19.5371, 0, 1.39167));
}

// only activates if the previous conditions are true
Status WalkAction::update(float seconds){

    glm::vec3 pos =  m_global_blackboard[m_entity_id].locationData.currPos;

    // get a path if entity is not pathfinding
    if (!m_global_blackboard[m_entity_id].conditionData["isPathfinding"].conditionTrue &&
            !m_global_blackboard[m_entity_id].conditionData["atDestination"].conditionTrue &&
            !m_global_blackboard[m_entity_id].conditionData["pathfound"].conditionTrue){
        setPath(pos);
        m_global_blackboard[m_entity_id].conditionData["isPathfinding"].conditionTrue = true;
        m_global_blackboard[m_entity_id].conditionData["pathfound"].conditionTrue = true;

    }

    if (!m_path.empty()){
        if (m_global_blackboard[m_entity_id].conditionData["onGround"].conditionTrue){
            //std::cout << "on ground" << std::endl;

            std::shared_ptr<ModelTransform> temp_mt = std::make_shared<ModelTransform>();
            temp_mt->setPos(pos);
            glm::vec3 v = m_path.back();//glm::vec3(m_path.back().x, pos.y, m_path.back().z);
            glm::vec3 dir = glm::normalize(v-temp_mt->getPos());
            temp_mt->translate(dir);
            //std::cout << "v: (" << v.x << ", " << v.y << ", " << v.z << ")" << std::endl;
            glm::vec3 pos_eps = v + .01f;
            glm::vec3 neg_eps = v - .01f;

            // pop if entity within a certain episilon of node
            if (neg_eps.x < temp_mt->getPos().x < pos_eps.x &&
                    neg_eps.z < temp_mt->getPos().z < pos_eps.z){
                 m_path.pop_back();
            }

            m_global_blackboard[m_entity_id].locationData.setToPos = temp_mt->getPos();
        }

        return Status::RUNNING;
    }

    // if reached destination, then walking succeeded
    if (pos.x == m_destination.x && pos.z == m_destination.z){
        m_global_blackboard[m_entity_id].conditionData["isPathfinding"].conditionTrue = false;
        m_global_blackboard[m_entity_id].conditionData["atDestination"].conditionTrue = true;
        std::cout << "-reached-" << std::endl;
        return Status::SUCCESS;

    }

    // otherwise
    m_global_blackboard[m_entity_id].conditionData["isPathfinding"].conditionTrue = false;
    return Status::FAIL;

}

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