]> git.localhorst.tv Git - blobs.git/blob - src/creature/need.cpp
b56950070e974d6f56e48be084ea419ec4567b22
[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         value = std::min(1.0, value + gain * dt);
17 }
18
19
20 IngestNeed::IngestNeed(int resource, double speed, double damage)
21 : resource(resource)
22 , speed(speed)
23 , damage(damage) {
24 }
25
26 IngestNeed::~IngestNeed() {
27 }
28
29 void IngestNeed::ApplyEffect(Creature &c, double dt) {
30         if (!IsSatisfied()) {
31                 // TODO: find resource and start ingest task
32         }
33         if (IsCritical()) {
34                 c.Hurt(damage * dt);
35         }
36 }
37
38
39 InhaleNeed::InhaleNeed(int resource, double speed, double damage)
40 : resource(resource)
41 , speed(speed)
42 , damage(damage) {
43 }
44
45 InhaleNeed::~InhaleNeed() {
46 }
47
48 void InhaleNeed::ApplyEffect(Creature &c, double dt) {
49         if (!IsSatisfied()) {
50                 // TODO: make condition more natural with thresholds and stuff
51                 if (c.GetSituation().OnPlanet() && c.GetSituation().GetPlanet().Atmosphere() == resource) {
52                         value = std::max(0.0, value - (speed * dt));
53                 } else {
54                         // TODO: panic
55                 }
56         }
57         if (IsCritical()) {
58                 c.Hurt(damage * dt);
59         }
60 }
61
62 }
63 }