]> git.localhorst.tv Git - blobs.git/blob - src/creature/need.cpp
smooth breathing a bit
[blobs.git] / src / creature / need.cpp
1 #include "Need.hpp"
2 #include "InhaleNeed.hpp"
3 #include "IngestNeed.hpp"
4
5 #include "Creature.hpp"
6 #include "../world/Planet.hpp"
7
8
9 namespace blobs {
10 namespace creature {
11
12 Need::~Need() {
13 }
14
15 void Need::Tick(double dt) noexcept {
16         Increase(gain * dt);
17 }
18
19 void Need::Increase(double delta) noexcept {
20         value = std::min(1.0, value + delta);
21 }
22
23 void Need::Decrease(double delta) noexcept {
24         value = std::max(0.0, value - delta);
25 }
26
27
28 IngestNeed::IngestNeed(int resource, double speed, double damage)
29 : resource(resource)
30 , speed(speed)
31 , damage(damage) {
32 }
33
34 IngestNeed::~IngestNeed() {
35 }
36
37 void IngestNeed::ApplyEffect(Creature &c, double dt) {
38         if (!IsSatisfied()) {
39                 // TODO: find resource and start ingest task
40         }
41         if (IsCritical()) {
42                 c.Hurt(damage * dt);
43         }
44 }
45
46
47 InhaleNeed::InhaleNeed(int resource, double speed, double damage)
48 : resource(resource)
49 , speed(speed)
50 , damage(damage)
51 , inhaling(false) {
52 }
53
54 InhaleNeed::~InhaleNeed() {
55 }
56
57 void InhaleNeed::ApplyEffect(Creature &c, double dt) {
58         if (!IsSatisfied() && !inhaling) {
59                 inhaling = true;
60         }
61         if (inhaling) {
62                 if (c.GetSituation().OnPlanet() && c.GetSituation().GetPlanet().Atmosphere() == resource) {
63                         Decrease(speed * dt);
64                         if (value == 0.0) {
65                                 inhaling = false;
66                         }
67                 } else {
68                         // TODO: panic
69                 }
70         }
71         if (IsCritical()) {
72                 c.Hurt(damage * dt);
73         }
74 }
75
76 }
77 }