#include "../creature/Need.hpp"
#include "../graphics/Viewport.hpp"
+#include <iomanip>
+#include <sstream>
#include <glm/gtx/transform.hpp>
: assets(assets)
, c(nullptr)
, name(new Label(assets.fonts.large))
+, age(new Label(assets.fonts.medium))
+, mass(new Label(assets.fonts.medium))
+, pos(new Label(assets.fonts.medium))
+, tile(new Label(assets.fonts.medium))
+, goal(new Label(assets.fonts.medium))
, needs(new Panel)
, panel()
, health_meter(new Meter)
health_panel
->Add(health_label)
->Add(health_meter)
+ ->Spacing(10.0f)
+ ->Direction(Panel::HORIZONTAL);
+
+ age->Text("0000s (Newborn)");
+ Label *age_label = new Label(assets.fonts.medium);
+ age_label->Text("Age");
+ Panel *age_panel = new Panel;
+ age_panel
+ ->Add(age_label)
+ ->Add(age)
+ ->Spacing(10.0f)
+ ->Direction(Panel::HORIZONTAL);
+
+ mass->Text("00.000kg");
+ Label *mass_label = new Label(assets.fonts.medium);
+ mass_label->Text("Mass");
+ Panel *mass_panel = new Panel;
+ mass_panel
+ ->Add(mass_label)
+ ->Add(mass)
+ ->Spacing(10.0f)
+ ->Direction(Panel::HORIZONTAL);
+
+ pos->Text("<00.0, 00.0, 00.0>");
+ Label *pos_label = new Label(assets.fonts.medium);
+ pos_label->Text("Pos");
+ Panel *pos_panel = new Panel;
+ pos_panel
+ ->Add(pos_label)
+ ->Add(pos)
+ ->Spacing(10.0f)
+ ->Direction(Panel::HORIZONTAL);
+
+ tile->Text("<00, 00> (mountains)");
+ Label *tile_label = new Label(assets.fonts.medium);
+ tile_label->Text("Tile");
+ Panel *tile_panel = new Panel;
+ tile_panel
+ ->Add(tile_label)
+ ->Add(tile)
+ ->Spacing(10.0f)
+ ->Direction(Panel::HORIZONTAL);
+
+ goal->Text("long goal description");
+ Label *goal_label = new Label(assets.fonts.medium);
+ goal_label->Text("Goal");
+ Panel *goal_panel = new Panel;
+ goal_panel
+ ->Add(goal_label)
+ ->Add(goal)
+ ->Spacing(10.0f)
->Direction(Panel::HORIZONTAL);
+
panel
.Add(name)
+ ->Add(age_panel)
+ ->Add(mass_panel)
+ ->Add(pos_panel)
+ ->Add(tile_panel)
+ ->Add(goal_panel)
->Add(health_panel)
->Add(needs)
->Padding(glm::vec2(10.0f))
void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept {
if (!c) return;
+ age->Text(std::to_string(int(c->Age())) + "s (" + c->AgeName() + ")");
+ {
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(3) << c->Mass() << "kg";
+ mass->Text(ss.str());
+ }
+ {
+ const glm::dvec3 &p = c->GetSituation().Position();
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(1)
+ << "<" << p.x << ", " << p.y << ", " << p.z << ">";
+ pos->Text(ss.str());
+ }
+ {
+ glm::ivec2 t = c->GetSituation().SurfacePosition();
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(1)
+ << "<" << t.x << ", " << t.y
+ << "> (" << c->GetSituation().GetTileType().label << ")";
+ tile->Text(ss.str());
+ }
+ if (c->Goals().empty()) {
+ goal->Text("none");
+ } else {
+ goal->Text(c->Goals()[0]->Describe());
+ }
health_meter->Value(c->Health());
if (need_meters.size() != c->Needs().size()) {