X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2Fui.cpp;h=c53426a65c8c119ad8204e3fa7fa78de02f330cd;hb=cd9cee86b336b5ec531028ac2deebb391e48ed21;hp=7ad47dab4ec34a3f8cbf24726a0ff76664e09bd9;hpb=320b9f79dcdd2fa9da0370b62f1ec24fa47de967;p=blobs.git diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp index 7ad47da..c53426a 100644 --- a/src/ui/ui.cpp +++ b/src/ui/ui.cpp @@ -4,8 +4,11 @@ #include "Meter.hpp" #include "../app/Assets.hpp" #include "../creature/Creature.hpp" +#include "../creature/Need.hpp" #include "../graphics/Viewport.hpp" +#include +#include #include @@ -16,10 +19,88 @@ CreaturePanel::CreaturePanel(const app::Assets &assets) : 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() { +, panel() +, health_meter(new Meter) +, need_meters() { + Label *health_label = new Label(assets.fonts.medium); + health_label->Text("Health"); + health_meter + ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent())) + ->Padding(glm::vec2(1.0f)) + ->Border(1.0f) + ->FillColor(glm::vec4(0.9f, 0.0f, 0.0f, 1.0f)) + ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); + Panel *health_panel = new Panel; + health_panel + ->Add(health_label) + ->Add(health_meter) + ->Spacing(10.0f) + ->Direction(Panel::HORIZONTAL); + + age->Text("0000s"); + 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)) ->Spacing(10.0f) @@ -39,15 +120,14 @@ void CreaturePanel::Show(creature::Creature &cr) { void CreaturePanel::CreateNeeds() { needs->Clear()->Reserve(c->Needs().size()); - meters.clear(); - meters.reserve(c->Needs().size()); + need_meters.clear(); + need_meters.reserve(c->Needs().size()); for (auto &need : c->Needs()) { Label *label = new Label(assets.fonts.medium); - label - ->Text(assets.data.resources[need.resource].label); + label->Text(need->name); Meter *meter = new Meter; meter - ->Value(1.0f - need.value) + ->Value(1.0f - need->value) ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent())) ->Padding(glm::vec2(1.0f)) ->Border(1.0f) @@ -60,7 +140,7 @@ void CreaturePanel::CreateNeeds() { ->Add(label) ->Add(meter); needs->Add(need_panel); - meters.push_back(meter); + need_meters.push_back(meter); } panel.Relayout(); } @@ -72,16 +152,49 @@ void CreaturePanel::Hide() noexcept { void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept { if (!c) return; - if (meters.size() != c->Needs().size()) { + age->Text(std::to_string(int(c->Age())) + "s"); + { + 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()) { CreateNeeds(); } else { auto need = c->Needs().begin(); auto need_end = c->Needs().end(); - auto meter = meters.begin(); + auto meter = need_meters.begin(); for (; need != need_end; ++need, ++meter) { - (*meter)->Value(1.0f - need->value)->FillColor(need->IsSatisfied() - ? glm::vec4(0.0f, 0.0f, 0.0f, 1.0f) - : glm::vec4(1.0f, 0.0f, 0.0f, 1.0f)); + (*meter)->Value(1.0f - (*need)->value); + if ((*need)->IsSatisfied()) { + (*meter)->FillColor(glm::vec4(0.0f, 0.7f, 0.0f, 1.0f)); + } else if ((*need)->IsInconvenient()) { + (*meter)->FillColor(glm::vec4(0.7f, 0.5f, 0.0f, 1.0f)); + } else { + (*meter)->FillColor(glm::vec4(0.9f, 0.0f, 0.0f, 1.0f)); + } } }