This wouldn't have been an issue, if there weren't also a local variable of the same name in the evaluation function. The way it was though, it caused an error when trying to execute an attack by the AI leader.
Since MacOS doesn't properly support std::variant (it has problems with std::visit specifically) unless it targets MacOS 10.14 or later, this adds a wrapper class that uses std::variant and friends on all platforms except MacOS, where boost::variant is used. The USING_BOOST_VARIANT define is then defined on MacOS and should be used to guard for code (such as inheriting from boost::static_visitor) that isn't needed with std::variant.
unit::upkeep_parser_visitor is still unconditionally boost::variant-compatible since it's used by const_attribute_value::apply_visitor, and configs still use boost::variant under the hood.
Additionally, these visitors are used in multiple places, so I can't convert them to lambas in-class.
Finally, I used brace-init for the upkeep types and visitors to make it clearer these are not functions.
As for the static_cast changes, for some reason mingw had issues converting double or long long int to the upkeep variant (which keeps an int specifically). No idea why it had no problem dealing with this with boost::variant.
05b_Isle_of_the_Damned was using black magic: [store_unit] plus [set_variable] to change a unit's id. This confused wmllint. This is also just unnecessarily complicated since there are two more conventional ways to refer to the same unit: role=Advisor and id=$hidden_advisor.id
It is a common mistake to have a unit speak in his/her "die" event (after the death animation is played). Wmllint tries to catch that. In this case, however, Inky does not actually die (as far as the plot is concerned) so it is a perfectly
valid stylistic choice for her to make a "Bloub" sound as she dives into the water.
In general I think it's best to use std implementations unless there's a functional or performance reason not to, but also in a few cases this also allows removing the include of lexical_cast.hpp.
This doesn't touch cases where `std::tie` was used with `std::ignore`, since there isn't a way to
ignore a variable in structured bindings and choosing a random variable name might trigger unused
variable warnings on CI (will have to confirm that, though).
Using location_id (which accepts multiple values sice 1.15.0)
and the new macros for handling overlays and ellipses.
Side effect: the now-leaders won't have the loyal trait anmore