summaryrefslogtreecommitdiff
path: root/src/game/interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/interface.cpp')
-rw-r--r--src/game/interface.cpp96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/game/interface.cpp b/src/game/interface.cpp
index 26ade2a..34bbcf2 100644
--- a/src/game/interface.cpp
+++ b/src/game/interface.cpp
@@ -328,11 +328,83 @@ void pie_menu_t::render_to(render::state_t *render)
}
}
+static sf::Color health_to_color(float frac,int alpha)
+{
+ int t;
+
+ if (frac >= 1.0f)
+ return sf::Color(0, 255, 0, alpha);
+ else if (frac > 0.5f) {
+ t = (int)remap(1.0f, 0.5f, 0.0f, 255.0f, frac);
+ return sf::Color(t, 255, 0, alpha);
+ } else if (frac > 0.0f) {
+ t = (int)remap(0.5f, 0.0f, 255.0f, 0.0f, frac);
+ return sf::Color(255, t, 0, alpha);
+ } else
+ return sf::Color(255, 0, 0, alpha);
+}
+
+static void render_avatar(render::state_t *render, game::unit_t *unit, v2f_t at,
+ v2f_t avatar_size, float em, bool large)
+{
+ render::animated_texture_t *image;
+ rectf_t rect, bar;
+ v2f_t x;
+ std::string str;
+ float frac;
+
+ switch (unit->type) {
+ case game::unit_t::UNIT_SOLDIER:
+ image = &assets::soldier.avatar;
+ break;
+
+ default:
+ image = &assets::deco.eyething;
+ break;
+ }
+
+ rect = rectf_t(at, at + avatar_size * em);
+ render->render(0, image, rect, sf::Color::White);
+
+ frac = (float)unit->health / unit->max_health;
+
+ if (!large) {
+ bar = rect;
+ bar[0][1] = bar[1][1] - em;
+ render->render_rect(bar, sf::Color(0, 0, 0, 128));
+
+ bar[1][0] = lerp(bar[0][0], bar[1][0], frac);
+ render->render_rect(bar, health_to_color(frac, 90));
+
+ return;
+ }
+
+ x = v2f_t(rect[0][0], rect[1][1] - em / 2);
+ bar[0][0] = x[0];
+ bar[0][1] = x[1] - 0.5f * em;
+ bar[1][0] = rect[1][0];
+ bar[1][1] = bar[0][1] + 0.9f * em;
+ render->render_rect(bar, sf::Color(0, 0, 0, 128));
+
+ bar[1][0] = lerp(bar[0][0], bar[1][0], frac);
+ render->render_rect(bar, health_to_color(frac, 90));
+
+ str = std::to_string(unit->health) + "/" + std::to_string(unit->max_health);
+ render->render_text(x, em, str, render::ALIGN_LEFT_BOTTOM, sf::Color::White);
+
+ x[1] -= em;
+ render->render_text(x + v2f_t(0.1, 0.1) * em, em, unit->name, render::ALIGN_LEFT_BOTTOM, sf::Color::Black);
+ render->render_text(x, em, unit->name, render::ALIGN_LEFT_BOTTOM, sf::Color::White);
+}
+
void state_t::render_to(render::state_t *render)
{
size_t w = window->getSize().x, h = window->getSize().y;
v2f_t x;
std::stringstream ss;
+ v2f_t avatar_size;
+ bool large_avatars = true;
+ size_t row = 0;
if (select.selecting) {
sf::Color color;
@@ -355,7 +427,31 @@ void state_t::render_to(render::state_t *render)
}
window->setView(sf::View(sf::FloatRect(0, 0, w, h)));
+
em = std::max(w, h) * 0.017;
+ if (em < 15.0f)
+ em = 15.0f;
+
+ avatar_size = v2f_t(6, 10);
+
+ if (game->selected_units.size() > 8)
+ large_avatars = false;
+
+ if (game->selected_units.size() > 4)
+ avatar_size /= (game->selected_units.size() - 5.0f) * 0.1f + 1.0f;
+
+ x = v2f_t(w, h) - avatar_size * em;
+ for (unit_t *unit : game->selected_units) {
+ render_avatar(render, unit, x, avatar_size, em, large_avatars);
+
+ row++;
+ if (row >= 4) {
+ x[0] = w - avatar_size[0] * em;
+ x[1] -= avatar_size[1] * em;
+ row = 0;
+ } else
+ x[0] -= avatar_size[0] * em;
+ }
pie_menu.render_to(render);