]> git.localhorst.tv Git - blobs.git/blob - src/creature/need.cpp
eat what's here
[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 #include "../world/TileType.hpp"
8
9
10 namespace blobs {
11 namespace creature {
12
13 Need::~Need() {
14 }
15
16 void Need::Tick(double dt) noexcept {
17         Increase(gain * dt);
18 }
19
20 void Need::Increase(double delta) noexcept {
21         value = std::min(1.0, value + delta);
22 }
23
24 void Need::Decrease(double delta) noexcept {
25         value = std::max(0.0, value - delta);
26 }
27
28
29 IngestNeed::IngestNeed(int resource, double speed, double damage)
30 : resource(resource)
31 , speed(speed)
32 , damage(damage)
33 , ingesting(false) {
34 }
35
36 IngestNeed::~IngestNeed() {
37 }
38
39 void IngestNeed::ApplyEffect(Creature &c, double dt) {
40         if (!IsSatisfied()) {
41                 ingesting = true;
42         }
43         if (!IsSatisfied()) {
44                 // TODO: find resource and start ingest task
45                 if (c.GetSituation().OnSurface()) {
46                         const world::TileType &t = c.GetSituation().GetTileType();
47                         for (auto &yield : t.resources) {
48                                 if (yield.resource == resource) {
49                                         Decrease(std::min(yield.ubiquity, speed) * dt);
50                                         break;
51                                 }
52                         }
53                 }
54         }
55         if (IsCritical()) {
56                 c.Hurt(damage * dt);
57         }
58 }
59
60
61 InhaleNeed::InhaleNeed(int resource, double speed, double damage)
62 : resource(resource)
63 , speed(speed)
64 , damage(damage)
65 , inhaling(false) {
66 }
67
68 InhaleNeed::~InhaleNeed() {
69 }
70
71 void InhaleNeed::ApplyEffect(Creature &c, double dt) {
72         if (!IsSatisfied()) {
73                 inhaling = true;
74         }
75         if (inhaling) {
76                 if (c.GetSituation().OnPlanet() && c.GetSituation().GetPlanet().Atmosphere() == resource) {
77                         Decrease(speed * dt);
78                         if (value == 0.0) {
79                                 inhaling = false;
80                         }
81                 } else {
82                         // TODO: panic
83                 }
84         }
85         if (IsCritical()) {
86                 c.Hurt(damage * dt);
87         }
88 }
89
90 }
91 }