1 #include "CreaturePanel.hpp"
5 #include "../app/Assets.hpp"
6 #include "../creature/Creature.hpp"
7 #include "../graphics/Viewport.hpp"
12 #include <glm/gtx/io.hpp>
13 #include <glm/gtx/transform.hpp>
19 CreaturePanel::CreaturePanel(const app::Assets &assets)
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 , vel(new Label(assets.fonts.medium))
28 , dir(new Label(assets.fonts.medium))
29 , tile(new Label(assets.fonts.medium))
30 , goal(new Label(assets.fonts.medium))
34 born->Text("00h 00m 00s");
35 Label *born_label = new Label(assets.fonts.medium);
36 born_label->Text("Born");
37 Panel *born_panel = new Panel;
42 ->Direction(Panel::HORIZONTAL);
44 age->Text("00h 00m 00s");
45 Label *age_label = new Label(assets.fonts.medium);
46 age_label->Text("Age");
47 Panel *age_panel = new Panel;
52 ->Direction(Panel::HORIZONTAL);
54 mass->Text("00.000kg");
55 Label *mass_label = new Label(assets.fonts.medium);
56 mass_label->Text("Mass");
57 Panel *mass_panel = new Panel;
62 ->Direction(Panel::HORIZONTAL);
64 pos->Text("<00.0, 00.0, 00.0>");
65 Label *pos_label = new Label(assets.fonts.medium);
66 pos_label->Text("Pos");
67 Panel *pos_panel = new Panel;
72 ->Direction(Panel::HORIZONTAL);
74 vel->Text("<00.0, 00.0, 00.0>");
75 Label *vel_label = new Label(assets.fonts.medium);
76 vel_label->Text("Vel");
77 Panel *vel_panel = new Panel;
82 ->Direction(Panel::HORIZONTAL);
84 dir->Text("<0.00, 0.00, 0.00>");
85 Label *dir_label = new Label(assets.fonts.medium);
86 dir_label->Text("Dir");
87 Panel *dir_panel = new Panel;
92 ->Direction(Panel::HORIZONTAL);
94 tile->Text("<00, 00> (mountains)");
95 Label *tile_label = new Label(assets.fonts.medium);
96 tile_label->Text("Tile");
97 Panel *tile_panel = new Panel;
102 ->Direction(Panel::HORIZONTAL);
104 goal->Text("long goal description");
105 Label *goal_label = new Label(assets.fonts.medium);
106 goal_label->Text("Goal");
107 Panel *goal_panel = new Panel;
112 ->Direction(Panel::HORIZONTAL);
114 Label *stat_label[7];
115 for (int i = 0; i < 7; ++i) {
116 stat_label[i] = new Label(assets.fonts.medium);
117 stats[i] = new Meter;
119 ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent()))
120 ->Padding(glm::vec2(1.0f))
122 ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
124 stat_label[0]->Text("Damage");
125 stat_label[1]->Text("Breath");
126 stat_label[2]->Text("Thirst");
127 stat_label[3]->Text("Hunger");
128 stat_label[4]->Text("Exhaustion");
129 stat_label[5]->Text("Fatigue");
130 stat_label[6]->Text("Boredom");
132 Panel *stat_label_panel = new Panel;
135 ->Direction(Panel::VERTICAL);
136 Panel *stat_meter_panel = new Panel;
138 ->Spacing(stat_label[0]->Size().y - stats[0]->Size().y + 2)
139 ->Direction(Panel::VERTICAL);
140 for (int i = 0; i < 7; ++i) {
141 stat_label_panel->Add(stat_label[i]);
142 stat_meter_panel->Add(stats[i]);
144 Panel *stat_panel = new Panel;
146 ->Direction(Panel::HORIZONTAL)
148 ->Add(stat_label_panel)
149 ->Add(stat_meter_panel);
151 Label *prop_label[8];
152 for (int i = 0; i < 8; ++i) {
153 prop_label[i] = new Label(assets.fonts.medium);
154 props[i] = new Label(assets.fonts.medium);
156 prop_label[0]->Text("Strength");
157 prop_label[1]->Text("Stamina");
158 prop_label[2]->Text("Dexerty");
159 prop_label[3]->Text("Intelligence");
160 prop_label[4]->Text("Lifetime");
161 prop_label[5]->Text("Fertility");
162 prop_label[6]->Text("Mutability");
163 prop_label[7]->Text("Offspring mass");
165 Panel *prop_label_panel = new Panel;
168 ->Direction(Panel::VERTICAL);
169 Panel *prop_meter_panel = new Panel;
172 ->Direction(Panel::VERTICAL);
173 for (int i = 0; i < 8; ++i) {
174 prop_label_panel->Add(prop_label[i]);
175 prop_meter_panel->Add(props[i]);
177 Panel *prop_panel = new Panel;
179 ->Direction(Panel::HORIZONTAL)
181 ->Add(prop_label_panel)
182 ->Add(prop_meter_panel);
196 ->Padding(glm::vec2(10.0f))
198 ->Direction(Panel::VERTICAL)
199 ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f));
202 CreaturePanel::~CreaturePanel() {
206 void CreaturePanel::Show(creature::Creature &cr) {
208 name->Text(c->Name());
209 born->Time(c->Born());
212 void CreaturePanel::Hide() noexcept {
216 void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
220 mass->Mass(c->Mass());
222 const glm::dvec3 &p = c->GetSituation().Position();
223 std::stringstream ss;
224 ss << std::fixed << std::setprecision(1)
225 << "<" << p.x << ", " << p.y << ", " << p.z << ">";
229 const glm::dvec3 &v = c->GetSituation().Velocity();
230 std::stringstream ss;
231 ss << std::fixed << std::setprecision(1)
232 << "<" << v.x << ", " << v.y << ", " << v.z << ">";
236 const glm::dvec3 &d = c->GetSituation().GetState().dir;
237 std::stringstream ss;
238 ss << std::fixed << std::setprecision(2)
239 << "<" << d.x << ", " << d.y << ", " << d.z << ">";
243 glm::ivec2 t = c->GetSituation().SurfacePosition();
244 std::stringstream ss;
245 ss << std::fixed << std::setprecision(1)
246 << "<" << t.x << ", " << t.y
247 << "> (" << c->GetSituation().GetTileType().label << ")";
248 tile->Text(ss.str());
250 if (c->Goals().empty()) {
253 goal->Text(c->Goals()[0]->Describe());
256 for (int i = 0; i < 7; ++i) {
257 stats[i]->Value(c->GetStats().stat[i].value);
258 if (c->GetStats().stat[i].Okay()) {
259 stats[i]->FillColor(glm::vec4(0.0f, 0.7f, 0.0f, 1.0f));
260 } else if (c->GetStats().stat[i].Critical()) {
261 stats[i]->FillColor(glm::vec4(0.7f, 0.0f, 0.0f, 1.0f));
263 stats[i]->FillColor(glm::vec4(0.9f, 0.4f, 0.0f, 1.0f));
267 props[0]->Decimal(c->Strength());
268 props[1]->Decimal(c->Stamina());
269 props[2]->Decimal(c->Dexerty());
270 props[3]->Decimal(c->Intelligence());
271 props[4]->Time(c->Lifetime());
272 props[5]->Percentage(c->Fertility());
273 props[6]->Percentage(c->Mutability());
274 props[7]->Mass(c->OffspringMass());
276 const glm::vec2 margin(20.0f);
278 panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y));
279 panel.Draw(assets, viewport);