+ while (comp.size() > components.size()) {
+ components.emplace_back(new Label(assets.fonts.medium));
+ composition->Add(components.back());
+ }
+ }
+ {
+ int i = 0;
+ for (auto &cmp : comp) {
+ components[i]->Text(
+ PercentageString(cmp.value / comp.TotalMass())
+ + " " + assets.data.resources[cmp.resource].label);
+ ++i;
+ }
+ }
+
+ for (int i = 0; i < 7; ++i) {
+ stats[i]->Value(c->GetStats().stat[i].value);
+ if (c->GetStats().stat[i].Okay()) {
+ stats[i]->FillColor(glm::vec4(0.0f, 0.7f, 0.0f, 1.0f));
+ } else if (c->GetStats().stat[i].Critical()) {
+ stats[i]->FillColor(glm::vec4(0.7f, 0.0f, 0.0f, 1.0f));
+ } else {
+ stats[i]->FillColor(glm::vec4(0.9f, 0.4f, 0.0f, 1.0f));
+ }
+ }
+
+ props[0]->Text(DecimalString(c->Strength(), 2));
+ props[1]->Text(DecimalString(c->Stamina(), 2));
+ props[2]->Text(DecimalString(c->Dexerty(), 2));
+ props[3]->Text(DecimalString(c->Intelligence(), 2));
+ props[4]->Text(TimeString(c->Lifetime()));
+ props[5]->Text(PercentageString(c->Fertility()));
+ props[6]->Text(PercentageString(c->Mutability()));
+ props[7]->Text(MassString(c->OffspringMass()));
+
+ const glm::vec2 margin(20.0f);
+ panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y));
+ panel.Draw(assets, viewport);
+}
+
+
+RecordsPanel::RecordsPanel(world::Simulation &sim)
+: sim(sim)
+, live(new Label(sim.Assets().fonts.medium))
+, records()
+, holders()
+, panel() {
+ Label *live_label = new Label(sim.Assets().fonts.medium);
+ live_label->Text("Creatures alive");
+
+ Panel *label_panel = new Panel;
+ label_panel
+ ->Direction(Panel::VERTICAL)
+ ->Add(live_label);
+
+ Panel *value_panel = new Panel;
+ value_panel
+ ->Direction(Panel::VERTICAL)
+ ->Add(live);
+
+ Label *holder_label = new Label(sim.Assets().fonts.medium);
+ holder_label->Text("Holder");
+ Panel *holder_panel = new Panel;
+ holder_panel
+ ->Direction(Panel::VERTICAL)
+ ->Add(holder_label);
+
+ records.reserve(sim.Records().size());
+ for (const auto &r : sim.Records()) {
+ Label *label = new Label(sim.Assets().fonts.medium);
+ label->Text(r.name + " record");
+ label_panel->Add(label);
+ Label *value = new Label(sim.Assets().fonts.medium);
+ value->Text("none");
+ value_panel->Add(value);
+ records.push_back(value);
+ Label *holder = new Label(sim.Assets().fonts.medium);
+ holder->Text("nobody");
+ holder_panel->Add(holder);
+ holders.push_back(holder);
+ }
+
+ panel
+ .Direction(Panel::HORIZONTAL)
+ ->Padding(glm::vec2(10.0f))
+ ->Spacing(10.0f)
+ ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f))
+ ->Add(label_panel)
+ ->Add(value_panel)
+ ->Add(holder_panel);
+}
+
+RecordsPanel::~RecordsPanel() {
+}
+
+void RecordsPanel::Draw(graphics::Viewport &viewport) noexcept {
+ live->Text(NumberString(sim.LiveCreatures().size()));
+ int i = 0;
+ for (const auto &r : sim.Records()) {
+ if (!r) continue;
+ switch (r.type) {
+ default:
+ case world::Record::VALUE:
+ records[i]->Text(DecimalString(r.value, 2));
+ break;
+ case world::Record::LENGTH:
+ records[i]->Text(LengthString(r.value));
+ break;
+ case world::Record::MASS:
+ records[i]->Text(MassString(r.value));
+ break;
+ case world::Record::PERCENTAGE:
+ records[i]->Text(PercentageString(r.value));
+ break;
+ case world::Record::TIME:
+ records[i]->Text(TimeString(r.value));
+ break;
+ }
+ std::string str(r.holder->Name());
+ bool first = true;
+ for (auto p : r.holder->Parents()) {
+ if (first) {
+ first = false;
+ str += " of ";