X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2Fui.cpp;h=9d73b925416a4cd4d00a6344a2683647bcf5b684;hb=96b12298b5aacfdd8564eb3eeff7fef453b9c8a0;hp=4cd660624cdeebd25f0f0f9c4c1a79278ca2c7bb;hpb=392826deaf802ac0960ed3924a3f98b9d18d381b;p=blobs.git diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp index 4cd6606..9d73b92 100644 --- a/src/ui/ui.cpp +++ b/src/ui/ui.cpp @@ -29,7 +29,11 @@ CreaturePanel::CreaturePanel(app::Assets &assets) , born(new Label(assets.fonts.medium)) , age(new Label(assets.fonts.medium)) , mass(new Label(assets.fonts.medium)) +, size(new Label(assets.fonts.medium)) , goal(new Label(assets.fonts.medium)) +, pos(new Label(assets.fonts.medium)) +, tile(new Label(assets.fonts.medium)) +, head(new Label(assets.fonts.medium)) , composition(new Panel) , stats{nullptr} , props{nullptr} @@ -42,6 +46,8 @@ CreaturePanel::CreaturePanel(app::Assets &assets) age_label->Text("Age"); Label *mass_label = new Label(assets.fonts.medium); mass_label->Text("Mass"); + Label *size_label = new Label(assets.fonts.medium); + size_label->Text("Size"); Label *goal_label = new Label(assets.fonts.medium); goal_label->Text("Goal"); @@ -52,6 +58,7 @@ CreaturePanel::CreaturePanel(app::Assets &assets) ->Add(born_label) ->Add(age_label) ->Add(mass_label) + ->Add(size_label) ->Add(goal_label); Panel *info_value_panel = new Panel; info_value_panel @@ -60,6 +67,7 @@ CreaturePanel::CreaturePanel(app::Assets &assets) ->Add(born) ->Add(age) ->Add(mass) + ->Add(size) ->Add(goal); Panel *info_panel = new Panel; info_panel @@ -68,6 +76,32 @@ CreaturePanel::CreaturePanel(app::Assets &assets) ->Add(info_label_panel) ->Add(info_value_panel); + Label *pos_label = new Label(assets.fonts.medium); + pos_label->Text("Pos"); + Label *tile_label = new Label(assets.fonts.medium); + tile_label->Text("Tile"); + Label *head_label = new Label(assets.fonts.medium); + head_label->Text("Heading"); + + Panel *loc_label_panel = new Panel; + loc_label_panel + ->Direction(Panel::VERTICAL) + ->Add(pos_label) + ->Add(tile_label) + ->Add(head_label); + Panel *loc_value_panel = new Panel; + loc_value_panel + ->Direction(Panel::VERTICAL) + ->Add(pos) + ->Add(tile) + ->Add(head); + Panel *loc_panel = new Panel; + loc_panel + ->Direction(Panel::HORIZONTAL) + ->Spacing(10.0f) + ->Add(loc_label_panel) + ->Add(loc_value_panel); + Label *stat_label[7]; for (int i = 0; i < 7; ++i) { stat_label[i] = new Label(assets.fonts.medium); @@ -91,6 +125,8 @@ CreaturePanel::CreaturePanel(app::Assets &assets) ->Spacing(2) ->Direction(Panel::VERTICAL); Panel *stat_meter_panel = new Panel; + stat_label[0]->Layout(); + stats[0]->Layout(); stat_meter_panel ->Spacing(stat_label[0]->Size().y - stats[0]->Size().y + 2) ->Direction(Panel::VERTICAL); @@ -105,8 +141,8 @@ CreaturePanel::CreaturePanel(app::Assets &assets) ->Add(stat_label_panel) ->Add(stat_meter_panel); - Label *prop_label[8]; - for (int i = 0; i < 8; ++i) { + Label *prop_label[9]; + for (int i = 0; i < 9; ++i) { prop_label[i] = new Label(assets.fonts.medium); props[i] = new Label(assets.fonts.medium); } @@ -117,7 +153,8 @@ CreaturePanel::CreaturePanel(app::Assets &assets) prop_label[4]->Text("Lifetime"); prop_label[5]->Text("Fertility"); prop_label[6]->Text("Mutability"); - prop_label[7]->Text("Offspring mass"); + prop_label[7]->Text("Adaptability"); + prop_label[8]->Text("Offspring mass"); Panel *prop_label_panel = new Panel; prop_label_panel @@ -127,7 +164,7 @@ CreaturePanel::CreaturePanel(app::Assets &assets) prop_meter_panel ->Spacing(2) ->Direction(Panel::VERTICAL); - for (int i = 0; i < 8; ++i) { + for (int i = 0; i < 9; ++i) { prop_label_panel->Add(prop_label[i]); prop_meter_panel->Add(props[i]); } @@ -141,13 +178,14 @@ CreaturePanel::CreaturePanel(app::Assets &assets) panel .Add(name) ->Add(info_panel) + ->Add(loc_panel) ->Add(composition) ->Add(stat_panel) ->Add(prop_panel) ->Padding(glm::vec2(10.0f)) ->Spacing(10.0f) ->Direction(Panel::VERTICAL) - ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f)); + ->Background(glm::vec4(1.0f, 1.0f, 1.0f, 0.7f)); } CreaturePanel::~CreaturePanel() { @@ -156,7 +194,6 @@ CreaturePanel::~CreaturePanel() { void CreaturePanel::Show(creature::Creature &cr) { c = &cr; - name->Text(c->Name()); born->Text(TimeString(c->Born())); if (c->Parents().empty()) { @@ -183,29 +220,32 @@ void CreaturePanel::Hide() noexcept { void CreaturePanel::Draw(graphics::Viewport &viewport) noexcept { if (!c) return; + name->Text(c->Name()); age->Text(TimeString(c->Age())); mass->Text(MassString(c->Mass())); + size->Text(LengthString(c->Size())); if (c->Goals().empty()) { goal->Text("none"); } else { goal->Text(c->Goals()[0]->Describe()); } + pos->Text(VectorString(c->GetSituation().Position(), 2)); + tile->Text(c->GetSituation().GetTileType().label + ( + c->GetSituation().OnGround() + ? (c->GetSituation().Moving() ? " (moving)" : " (standing)") + : (c->GetSituation().Moving() ? " (flying)" : " (hovering)") + )); + head->Text(VectorString(c->GetSituation().Heading(), 2)); + const creature::Composition &comp = c->GetComposition(); if (comp.size() < components.size()) { + components.clear(); composition->Clear(); - while (comp.size() < components.size()) { - delete components.back(); - components.pop_back(); - } - for (auto l : components) { - composition->Add(l); - } - } else { - while (comp.size() > components.size()) { - components.emplace_back(new Label(assets.fonts.medium)); - composition->Add(components.back()); - } + } + while (comp.size() > components.size()) { + components.emplace_back(new Label(assets.fonts.medium)); + composition->Add(components.back()); } { int i = 0; @@ -228,115 +268,106 @@ void CreaturePanel::Draw(graphics::Viewport &viewport) noexcept { } } - 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[0]->Text(DecimalString(c->Strength(), 2) + " / " + DecimalString(c->GetProperties().Strength(), 2)); + props[1]->Text(DecimalString(c->Stamina(), 2) + " / " + DecimalString(c->GetProperties().Stamina(), 2)); + props[2]->Text(DecimalString(c->Dexerty(), 2) + " / " + DecimalString(c->GetProperties().Dexerty(), 2)); + props[3]->Text(DecimalString(c->Intelligence(), 2) + " / " + DecimalString(c->GetProperties().Intelligence(), 2)); props[4]->Text(TimeString(c->Lifetime())); - props[5]->Text(PercentageString(c->Fertility())); + props[5]->Text(PercentageString(c->Fertility()) + " / " + PercentageString(c->GetProperties().Fertility())); props[6]->Text(PercentageString(c->Mutability())); - props[7]->Text(MassString(c->OffspringMass())); + props[7]->Text(PercentageString(c->Adaptability())); + props[8]->Text(MassString(c->OffspringMass())); const glm::vec2 margin(20.0f); panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y)); + panel.Layout(); 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); +, panel() +, shown(true) { + Label *rank_label = new Label(sim.Assets().fonts.medium); + rank_label->Text("Rank"); - Label *holder_label = new Label(sim.Assets().fonts.medium); - holder_label->Text("Holder"); - Panel *holder_panel = new Panel; - holder_panel + Panel *rank_panel = new Panel; + rank_panel ->Direction(Panel::VERTICAL) - ->Add(holder_label); + ->Add(rank_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); + for (int i = 0; i < world::Record::MAX; ++i) { + rank_label = new Label(sim.Assets().fonts.medium); + rank_label->Text(std::to_string(i + 1)); + rank_panel->Add(rank_label); } 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); + ->Spacing(45.0f) + ->Background(glm::vec4(1.0f, 1.0f, 1.0f, 0.7f)) + ->Add(rank_panel); + + records.reserve(sim.Records().size() * (world::Record::MAX + 1)); + holders.reserve(sim.Records().size() * (world::Record::MAX + 1)); + int ri = 0; + for (const auto &r : sim.Records()) { + Label *rec_label = new Label(sim.Assets().fonts.medium); + rec_label->Text(r.name); + Label *by_label = new Label(sim.Assets().fonts.medium); + by_label->Text("By"); + Panel *rec_panel = new Panel; + rec_panel + ->Direction(Panel::VERTICAL) + ->Add(rec_label); + Panel *by_panel = new Panel; + by_panel + ->Direction(Panel::VERTICAL) + ->Add(by_label); + for (int i = 0; i < world::Record::MAX; ++i) { + Label *val_label = new Label(sim.Assets().fonts.medium); + rec_panel->Add(val_label); + records.push_back(val_label); + Label *holder_label = new Label(sim.Assets().fonts.medium); + by_panel->Add(holder_label); + holders.push_back(holder_label); + } + Panel *group_panel = new Panel; + group_panel + ->Direction(Panel::HORIZONTAL) + ->Spacing(10.0f) + ->Add(rec_panel) + ->Add(by_panel); + panel.Add(group_panel); + ++ri; + } } RecordsPanel::~RecordsPanel() { } void RecordsPanel::Draw(graphics::Viewport &viewport) noexcept { - live->Text(NumberString(sim.LiveCreatures().size())); - int i = 0; + if (!shown) return; + + int ri = 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)); + for (int i = 0; i < world::Record::MAX; ++i) { + if (!r.rank[i]) { 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 "; - } else { - str += " and "; } - str += p->Name(); + records[ri * world::Record::MAX + i]->Text(r.ValueString(i)); + holders[ri * world::Record::MAX + i]->Text(r.rank[i].holder->Name()); } - holders[i]->Text(str); - ++i; + ++ri; } const glm::vec2 margin(20.0f); panel.Position(glm::vec2(margin.x, margin.y)); + panel.Layout(); panel.Draw(sim.Assets(), viewport); } @@ -344,9 +375,12 @@ void RecordsPanel::Draw(graphics::Viewport &viewport) noexcept { TimePanel::TimePanel(world::Simulation &sim) : sim(sim) , body(nullptr) +, live(new Label(sim.Assets().fonts.medium)) , time(new Label(sim.Assets().fonts.medium)) , clock(new Label(sim.Assets().fonts.medium)) , panel() { + Label *live_label = new Label(sim.Assets().fonts.medium); + live_label->Text("Alive"); Label *time_label = new Label(sim.Assets().fonts.medium); time_label->Text("Time"); Label *clock_label = new Label(sim.Assets().fonts.medium); @@ -355,12 +389,14 @@ TimePanel::TimePanel(world::Simulation &sim) Panel *label_panel = new Panel; label_panel ->Direction(Panel::VERTICAL) + ->Add(live_label) ->Add(time_label) ->Add(clock_label); Panel *value_panel = new Panel; value_panel ->Direction(Panel::VERTICAL) + ->Add(live) ->Add(time) ->Add(clock); @@ -368,7 +404,7 @@ TimePanel::TimePanel(world::Simulation &sim) .Direction(Panel::HORIZONTAL) ->Padding(glm::vec2(10.0f)) ->Spacing(10.0f) - ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f)) + ->Background(glm::vec4(1.0f, 1.0f, 1.0f, 0.7f)) ->Add(label_panel) ->Add(value_panel); } @@ -377,6 +413,7 @@ TimePanel::~TimePanel() { } void TimePanel::Draw(graphics::Viewport &viewport) noexcept { + live->Text(NumberString(sim.LiveCreatures().size())); time->Text(TimeString(sim.Time())); if (body) { clock->Text(TimeString(std::fmod(sim.Time(), body->RotationalPeriod()))); @@ -386,6 +423,7 @@ void TimePanel::Draw(graphics::Viewport &viewport) noexcept { const glm::vec2 margin(20.0f); panel.Position(glm::vec2(margin.x, viewport.Height() - margin.y - panel.Size().y)); + panel.Layout(); panel.Draw(sim.Assets(), viewport); }