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 , tile(new Label(assets.fonts.medium))
28 , goal(new Label(assets.fonts.medium))
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;
40 ->Direction(Panel::HORIZONTAL);
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;
50 ->Direction(Panel::HORIZONTAL);
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;
60 ->Direction(Panel::HORIZONTAL);
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;
70 ->Direction(Panel::HORIZONTAL);
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;
80 ->Direction(Panel::HORIZONTAL);
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;
90 ->Direction(Panel::HORIZONTAL);
93 for (int i = 0; i < 7; ++i) {
94 stat_label[i] = new Label(assets.fonts.medium);
97 ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent()))
98 ->Padding(glm::vec2(1.0f))
100 ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f));
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");
110 Panel *stat_label_panel = new Panel;
113 ->Direction(Panel::VERTICAL);
114 Panel *stat_meter_panel = new 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]);
122 Panel *stat_panel = new Panel;
124 ->Direction(Panel::HORIZONTAL)
126 ->Add(stat_label_panel)
127 ->Add(stat_meter_panel);
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);
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");
143 Panel *prop_label_panel = new Panel;
146 ->Direction(Panel::VERTICAL);
147 Panel *prop_meter_panel = new Panel;
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]);
155 Panel *prop_panel = new Panel;
157 ->Direction(Panel::HORIZONTAL)
159 ->Add(prop_label_panel)
160 ->Add(prop_meter_panel);
172 ->Padding(glm::vec2(10.0f))
174 ->Direction(Panel::VERTICAL)
175 ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f));
178 CreaturePanel::~CreaturePanel() {
182 void CreaturePanel::Show(creature::Creature &cr) {
184 name->Text(c->Name());
185 born->Time(c->Born());
188 void CreaturePanel::Hide() noexcept {
192 void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
196 mass->Mass(c->Mass());
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 << ">";
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());
212 if (c->Goals().empty()) {
215 goal->Text(c->Goals()[0]->Describe());
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));
225 stats[i]->FillColor(glm::vec4(0.9f, 0.4f, 0.0f, 1.0f));
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());
238 const glm::vec2 margin(20.0f);
240 panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y));
241 panel.Draw(assets, viewport);