]> git.localhorst.tv Git - blank.git/blob - src/ai/ai.cpp
another type of entity controller
[blank.git] / src / ai / ai.cpp
1 #include "Chaser.hpp"
2 #include "Controller.hpp"
3 #include "RandomWalk.hpp"
4
5 #include "../world/Entity.hpp"
6
7 #include <glm/glm.hpp>
8
9
10 namespace blank {
11
12 Chaser::Chaser(Entity &ctrl, Entity &tgt) noexcept
13 : Controller(ctrl)
14 , tgt(tgt)
15 , speed(0.002f)
16 , stop_dist(5 * 5)
17 , flee_dist(3 * 3) {
18
19 }
20
21 Chaser::~Chaser() {
22
23 }
24
25 void Chaser::Update(int dt) {
26         glm::vec3 diff(Target().AbsoluteDifference(Controlled()));
27         float dist = dot (diff, diff);
28         // TODO: line of sight test
29         if (dist > stop_dist) {
30                 Controlled().Velocity(normalize(diff) * speed);
31         } else if (dist < flee_dist) {
32                 Controlled().Velocity(normalize(diff) * -speed);
33         } else {
34                 Controlled().Velocity(glm::vec3(0.0f));
35         }
36 }
37
38
39 Controller::Controller(Entity &e) noexcept
40 : entity(e) {
41
42 }
43
44 Controller::~Controller() {
45
46 }
47
48
49 RandomWalk::RandomWalk(Entity &e) noexcept
50 : Controller(e)
51 , time_left(0) {
52
53 }
54
55 RandomWalk::~RandomWalk() {
56
57 }
58
59 void RandomWalk::Update(int dt) {
60         time_left -= dt;
61         if (time_left > 0) return;
62         time_left += 2500 + (rand() % 5000);
63
64         constexpr float move_vel = 0.0005f;
65
66         glm::vec3 new_vel = Controlled().Velocity();
67
68         switch (rand() % 9) {
69                 case 0:
70                         new_vel.x = -move_vel;
71                         break;
72                 case 1:
73                         new_vel.x = 0.0f;
74                         break;
75                 case 2:
76                         new_vel.x = move_vel;
77                         break;
78                 case 3:
79                         new_vel.y = -move_vel;
80                         break;
81                 case 4:
82                         new_vel.y = 0.0f;
83                         break;
84                 case 5:
85                         new_vel.y = move_vel;
86                         break;
87                 case 6:
88                         new_vel.z = -move_vel;
89                         break;
90                 case 7:
91                         new_vel.z = 0.0f;
92                         break;
93                 case 8:
94                         new_vel.z = move_vel;
95                         break;
96         }
97
98         Controlled().Velocity(new_vel);
99 }
100
101 }