]> git.localhorst.tv Git - blobs.git/blob - src/ui/ui.cpp
overhaul need system
[blobs.git] / src / ui / ui.cpp
1 #include "CreaturePanel.hpp"
2
3 #include "Label.hpp"
4 #include "Meter.hpp"
5 #include "../app/Assets.hpp"
6 #include "../creature/Creature.hpp"
7 #include "../graphics/Viewport.hpp"
8
9 #include <iomanip>
10 #include <iostream>
11 #include <sstream>
12 #include <glm/gtx/io.hpp>
13 #include <glm/gtx/transform.hpp>
14
15
16 namespace blobs {
17 namespace ui {
18
19 CreaturePanel::CreaturePanel(const app::Assets &assets)
20 : assets(assets)
21 , c(nullptr)
22 , name(new Label(assets.fonts.large))
23 , born(new Label(assets.fonts.medium))
24 , age(new Label(assets.fonts.medium))
25 , mass(new Label(assets.fonts.medium))
26 , pos(new Label(assets.fonts.medium))
27 , tile(new Label(assets.fonts.medium))
28 , goal(new Label(assets.fonts.medium))
29 , stats{nullptr}
30 , props{nullptr}
31 , panel() {
32         born->Text("00h 00m 00s");
33         Label *born_label = new Label(assets.fonts.medium);
34         born_label->Text("Born");
35         Panel *born_panel = new Panel;
36         born_panel
37                 ->Add(born_label)
38                 ->Add(born)
39                 ->Spacing(10.0f)
40                 ->Direction(Panel::HORIZONTAL);
41
42         age->Text("00h 00m 00s");
43         Label *age_label = new Label(assets.fonts.medium);
44         age_label->Text("Age");
45         Panel *age_panel = new Panel;
46         age_panel
47                 ->Add(age_label)
48                 ->Add(age)
49                 ->Spacing(10.0f)
50                 ->Direction(Panel::HORIZONTAL);
51
52         mass->Text("00.000kg");
53         Label *mass_label = new Label(assets.fonts.medium);
54         mass_label->Text("Mass");
55         Panel *mass_panel = new Panel;
56         mass_panel
57                 ->Add(mass_label)
58                 ->Add(mass)
59                 ->Spacing(10.0f)
60                 ->Direction(Panel::HORIZONTAL);
61
62         pos->Text("<00.0, 00.0, 00.0>");
63         Label *pos_label = new Label(assets.fonts.medium);
64         pos_label->Text("Pos");
65         Panel *pos_panel = new Panel;
66         pos_panel
67                 ->Add(pos_label)
68                 ->Add(pos)
69                 ->Spacing(10.0f)
70                 ->Direction(Panel::HORIZONTAL);
71
72         tile->Text("<00, 00> (mountains)");
73         Label *tile_label = new Label(assets.fonts.medium);
74         tile_label->Text("Tile");
75         Panel *tile_panel = new Panel;
76         tile_panel
77                 ->Add(tile_label)
78                 ->Add(tile)
79                 ->Spacing(10.0f)
80                 ->Direction(Panel::HORIZONTAL);
81
82         goal->Text("long goal description");
83         Label *goal_label = new Label(assets.fonts.medium);
84         goal_label->Text("Goal");
85         Panel *goal_panel = new Panel;
86         goal_panel
87                 ->Add(goal_label)
88                 ->Add(goal)
89                 ->Spacing(10.0f)
90                 ->Direction(Panel::HORIZONTAL);
91
92         Label *stat_label[7];
93         for (int i = 0; i < 7; ++i) {
94                 stat_label[i] = new Label(assets.fonts.medium);
95                 stats[i] = new Meter;
96                 stats[i]
97                         ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent()))
98                         ->Padding(glm::vec2(1.0f))
99                         ->Border(1.0f)
100                         ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
101         }
102         stat_label[0]->Text("Damage");
103         stat_label[1]->Text("Breath");
104         stat_label[2]->Text("Thirst");
105         stat_label[3]->Text("Hunger");
106         stat_label[4]->Text("Exhaustion");
107         stat_label[5]->Text("Fatigue");
108         stat_label[6]->Text("Boredom");
109
110         Panel *stat_label_panel = new Panel;
111         stat_label_panel
112                 ->Spacing(2)
113                 ->Direction(Panel::VERTICAL);
114         Panel *stat_meter_panel = new Panel;
115         stat_meter_panel
116                 ->Spacing(stat_label[0]->Size().y - stats[0]->Size().y + 2)
117                 ->Direction(Panel::VERTICAL);
118         for (int i = 0; i < 7; ++i) {
119                 stat_label_panel->Add(stat_label[i]);
120                 stat_meter_panel->Add(stats[i]);
121         }
122         Panel *stat_panel = new Panel;
123         stat_panel
124                 ->Direction(Panel::HORIZONTAL)
125                 ->Spacing(10)
126                 ->Add(stat_label_panel)
127                 ->Add(stat_meter_panel);
128
129         Label *prop_label[8];
130         for (int i = 0; i < 8; ++i) {
131                 prop_label[i] = new Label(assets.fonts.medium);
132                 props[i] = new Label(assets.fonts.medium);
133         }
134         prop_label[0]->Text("Strength");
135         prop_label[1]->Text("Stamina");
136         prop_label[2]->Text("Dexerty");
137         prop_label[3]->Text("Intelligence");
138         prop_label[4]->Text("Lifetime");
139         prop_label[5]->Text("Fertility");
140         prop_label[6]->Text("Mutability");
141         prop_label[7]->Text("Offspring mass");
142
143         Panel *prop_label_panel = new Panel;
144         prop_label_panel
145                 ->Spacing(2)
146                 ->Direction(Panel::VERTICAL);
147         Panel *prop_meter_panel = new Panel;
148         prop_meter_panel
149                 ->Spacing(2)
150                 ->Direction(Panel::VERTICAL);
151         for (int i = 0; i < 8; ++i) {
152                 prop_label_panel->Add(prop_label[i]);
153                 prop_meter_panel->Add(props[i]);
154         }
155         Panel *prop_panel = new Panel;
156         prop_panel
157                 ->Direction(Panel::HORIZONTAL)
158                 ->Spacing(10)
159                 ->Add(prop_label_panel)
160                 ->Add(prop_meter_panel);
161
162         panel
163                 .Add(name)
164                 ->Add(age_panel)
165                 ->Add(born_panel)
166                 ->Add(mass_panel)
167                 ->Add(pos_panel)
168                 ->Add(tile_panel)
169                 ->Add(goal_panel)
170                 ->Add(stat_panel)
171                 ->Add(prop_panel)
172                 ->Padding(glm::vec2(10.0f))
173                 ->Spacing(10.0f)
174                 ->Direction(Panel::VERTICAL)
175                 ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f));
176 }
177
178 CreaturePanel::~CreaturePanel() {
179 }
180
181
182 void CreaturePanel::Show(creature::Creature &cr) {
183         c = &cr;
184         name->Text(c->Name());
185         born->Time(c->Born());
186 }
187
188 void CreaturePanel::Hide() noexcept {
189         c = nullptr;
190 }
191
192 void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
193         if (!c) return;
194
195         age->Time(c->Age());
196         mass->Mass(c->Mass());
197         {
198                 const glm::dvec3 &p = c->GetSituation().Position();
199                 std::stringstream ss;
200                 ss << std::fixed << std::setprecision(1)
201                         << "<" << p.x << ", " << p.y << ", " << p.z << ">";
202                 pos->Text(ss.str());
203         }
204         {
205                 glm::ivec2 t = c->GetSituation().SurfacePosition();
206                 std::stringstream ss;
207                 ss << std::fixed << std::setprecision(1)
208                         << "<" << t.x << ", " << t.y
209                         << "> (" << c->GetSituation().GetTileType().label << ")";
210                 tile->Text(ss.str());
211         }
212         if (c->Goals().empty()) {
213                 goal->Text("none");
214         } else {
215                 goal->Text(c->Goals()[0]->Describe());
216         }
217
218         for (int i = 0; i < 7; ++i) {
219                 stats[i]->Value(c->GetStats().stat[i].value);
220                 if (c->GetStats().stat[i].Okay()) {
221                         stats[i]->FillColor(glm::vec4(0.0f, 0.7f, 0.0f, 1.0f));
222                 } else if (c->GetStats().stat[i].Critical()) {
223                         stats[i]->FillColor(glm::vec4(0.7f, 0.0f, 0.0f, 1.0f));
224                 } else {
225                         stats[i]->FillColor(glm::vec4(0.9f, 0.4f, 0.0f, 1.0f));
226                 }
227         }
228
229         props[0]->Decimal(c->Strength());
230         props[1]->Decimal(c->Stamina());
231         props[2]->Decimal(c->Dexerty());
232         props[3]->Decimal(c->Intelligence());
233         props[4]->Time(c->Lifetime());
234         props[5]->Percentage(c->Fertility());
235         props[6]->Percentage(c->Mutability());
236         props[7]->Mass(c->OffspringMass());
237
238         const glm::vec2 margin(20.0f);
239
240         panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y));
241         panel.Draw(assets, viewport);
242 }
243
244 }
245 }