The Battle for Wesnoth  1.19.6+dev
helper.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2024
3  by David White <dave@whitevine.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 /**
17  * @file
18  * Support functions for dealing with units.
19  */
20 
21 #include "units/unit.hpp"
22 #include "units/helper.hpp"
23 #include "units/types.hpp"
24 #include "play_controller.hpp"
25 #include "serialization/markup.hpp"
26 
27 namespace unit_helper {
28 
30 {
31  return u.advances_to().size() + u.get_modification_advances().size();
32 }
33 
35 {
36  if(!u.valid()) {
37  return false;
38  }
39  return u->advances() && number_of_possible_advances(*u) > 0;
40 }
41 
42 /**
43  * Maps resistance <= -60 (resistance value <= -60%) to intense red.
44  * Maps resistance >= 60 (resistance value >= 60%) to intense green.
45  * Intermediate values are affinely mapped to the red-to-green scale,
46  * with 0 (0%) being mapped to yellow.
47  * Compare attack_info_percent_color() in reports.cpp.
48  */
49 std::string resistance_color(const int resistance)
50 {
51  // Passing false to select the more saturated red-to-green scale.
52  return game_config::red_to_green(50.0 + resistance * 5.0 / 6.0, false).to_hex_string();
53 }
54 
55 static std::string unit_level_tooltip(const int level, const std::vector<std::string> &adv_to_types, const std::vector<config> &adv_to_mods)
56 {
57  std::ostringstream tooltip;
58  tooltip << _("Level: ") << markup::bold(level) << "\n";
59  const bool has_advancements = !adv_to_types.empty() || !adv_to_mods.empty();
60  if(has_advancements) {
61  tooltip << _("Advancements:") << "\n\t";
62  if(!adv_to_types.empty())
63  tooltip << markup::bold(utils::join(adv_to_types, "\n\t"));
64  if(!adv_to_mods.empty()) {
65  if(!adv_to_types.empty())
66  tooltip << "\n\t";
67  std::vector<std::string> descriptions;
68  for(const config& adv : adv_to_mods)
69  descriptions.push_back(adv["description"].str());
70  tooltip << markup::bold(utils::join(descriptions, "\n\t"));
71  }
72  } else {
73  tooltip << _("No advancement");
74  }
75  return tooltip.str();
76 }
77 
78 std::string unit_level_tooltip(const unit &u)
79 {
81 }
82 
83 std::string unit_level_tooltip(const unit_type &type)
84 {
85  const auto mod_adv_iters = type.modification_advancements();
86  const std::vector<config> mod_advancements(mod_adv_iters.begin(), mod_adv_iters.end());
87 
88  return unit_level_tooltip(type.level(), type.advances_to(), mod_advancements);
89 }
90 
91 }
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:172
A single unit type that the player may recruit.
Definition: types.hpp:43
This class represents a single unit of a specific type.
Definition: unit.hpp:133
static std::string _(const char *str)
Definition: gettext.hpp:93
int level() const
The current level of this unit.
Definition: unit.hpp:559
std::vector< config > get_modification_advances() const
Gets any non-typed advanced options set by modifications.
Definition: unit.cpp:1862
const advances_to_t & advances_to() const
Gets the possible types this unit can advance to on level-up.
Definition: unit.hpp:244
const std::vector< std::string > advances_to_translated() const
Gets the names of the possible types this unit can advance to on level-up.
Definition: unit.cpp:1234
std::string tooltip
Shown when hovering over an entry in the filter's drop-down list.
Definition: manager.cpp:202
color_t red_to_green(double val, bool for_text)
Return a color corresponding to the value val red for val=0.0 to green for val=100....
std::string bold(Args &&... data)
Definition: markup.hpp:128
static std::string unit_level_tooltip(const int level, const std::vector< std::string > &adv_to_types, const std::vector< config > &adv_to_mods)
Definition: helper.cpp:55
bool will_certainly_advance(const unit_map::iterator &u)
Encapsulates the logic for deciding whether an iterator u points to a unit that can advance.
Definition: helper.cpp:34
std::string resistance_color(const int resistance)
Maps resistance <= -60 (resistance value <= -60%) to intense red.
Definition: helper.cpp:49
int number_of_possible_advances(const unit &u)
Determines the total number of available advancements (of any kind) for a given unit.
Definition: helper.cpp:29
std::string join(const T &v, const std::string &s=",")
Generates a new string joining container items in a list.
std::string to_hex_string() const
Returns the stored color in rrggbb hex format.
Definition: color.cpp:88
bool valid() const
Definition: map.hpp:273