diff options
Diffstat (limited to 'src/game/interface.cpp')
-rw-r--r-- | src/game/interface.cpp | 96 |
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); |