58 #include <boost/algorithm/string/trim.hpp>
67 #ifdef __cpp_lib_format
75 using namespace std::chrono_literals;
79 #define ERR_DP LOG_STREAM(err, log_display)
80 #define WRN_DP LOG_STREAM(warn, log_display)
81 #define LOG_DP LOG_STREAM(info, log_display)
82 #define DBG_DP LOG_STREAM(debug, log_display)
85 #define zoom_levels (game_config::zoom_levels)
86 #define final_zoom_index (static_cast<int>(zoom_levels.size()) - 1)
87 #define DefaultZoom (game_config::tile_size)
88 #define SmallZoom (DefaultZoom / 2)
89 #define MinZoom (zoom_levels.front())
90 #define MaxZoom (zoom_levels.back())
108 float diff = *iter - *(iter - 1);
109 float lower = (zoom_level - *(iter - 1)) / diff;
110 float upper = (*iter - zoom_level) / diff;
123 std::vector<overlay>& overlays = get_overlays()[loc];
124 auto pos = std::find_if(overlays.begin(), overlays.end(),
125 [new_order = ov.z_order](
const overlay& existing) { return existing.z_order > new_order; });
127 auto inserted = overlays.emplace(pos, std::move(ov));
128 if(
const std::string&
halo = inserted->halo; !
halo.empty()) {
129 auto [x, y] = get_location_rect(loc).center();
130 inserted->halo_handle = halo_man_.add(x, y,
halo, loc);
136 get_overlays().erase(loc);
142 [&toDelete](
const overlay& ov) {
return ov.
image == toDelete || ov.
halo == toDelete || ov.
id == toDelete; });
146 std::weak_ptr<wb::manager>
wb,
148 const std::string& theme_id,
153 , exclusive_unit_draw_requests_()
154 , viewing_team_index_(0)
155 , dont_show_all_(false)
156 , viewport_origin_(0, 0)
157 , view_locked_(false)
162 , minimap_renderer_(nullptr)
164 , redraw_background_(false)
165 , invalidateAll_(true)
166 , diagnostic_label_(0)
167 , invalidateGameStatus_(true)
169 , reports_object_(&reports_object)
170 , scroll_event_(
"scrolled")
181 , tod_hex_mask1(nullptr)
182 , tod_hex_mask2(nullptr)
189 , animate_water_(true)
191 , playing_team_index_(0)
193 , map_screenshot_(false)
196 , reach_map_changed_(true)
198 , invalidated_hexes_(0)
200 , redraw_observers_()
219 if(tile_size < MinZoom || tile_size >
MaxZoom)
272 std::string
flag =
t.flag();
274 std::string new_rgb =
t.color();
280 LOG_DP <<
"Adding flag for side " <<
t.side() <<
" from animation " <<
flag;
287 for(
const std::string& item : items) {
288 const std::vector<std::string>& sub_items =
utils::split(item,
':');
289 std::string str = item;
292 if(sub_items.size() > 1) {
293 str = sub_items.front();
295 time = std::max(1ms, std::chrono::milliseconds{std::stoi(sub_items.back())});
296 }
catch(
const std::invalid_argument&) {
297 ERR_DP <<
"Invalid time value found when constructing flag for side " <<
t.side() <<
": " << sub_items.back();
301 std::stringstream temp;
302 temp << str <<
"~RC(" << old_rgb <<
">"<< new_rgb <<
")";
309 auto time =
f.get_end_time();
312 f.start_animation(std::chrono::milliseconds{start_time},
true);
315 ERR_DP <<
"missing flag for side " <<
t.side();
324 flag.update_last_draw_time();
327 ?
flag.get_current_frame()
328 :
flag.get_first_frame();
359 if(std::shared_ptr<wb::manager>
w =
wb_.lock()) {
360 w->on_viewer_change(teamindex);
373 if(!loc.
valid())
return false;
380 if(!loc.
valid())
return {};
419 std::ostringstream
s;
425 images.push_back(
s.str());
430 images.emplace_back();
480 rect max_area{0, 0, 0, 0};
506 if(max_area.w < res.w) {
508 res.x += (res.w - max_area.w) / 2;
512 if(max_area.h < res.h) {
514 res.y += (res.h - max_area.h) / 2;
534 return (x < area.x || x > area.x + area.w - x_thresh || y < area.y || y > area.y + area.h - y_thresh);
560 const int offset = y < 0 ? 1 : 0;
566 const int tesselation_x_size =
hex_width() * 2;
567 const int tesselation_y_size =
s;
568 const int x_base = x / tesselation_x_size * 2;
569 const int x_mod = x % tesselation_x_size;
570 const int y_base = y / tesselation_y_size;
571 const int y_mod = y % tesselation_y_size;
576 if (y_mod < tesselation_y_size / 2) {
577 if ((x_mod * 2 + y_mod) < (
s / 2)) {
580 }
else if ((x_mod * 2 - y_mod) < (
s * 3 / 2)) {
589 if ((x_mod * 2 - (y_mod -
s / 2)) < 0) {
592 }
else if ((x_mod * 2 + (y_mod -
s / 2)) <
s * 2) {
601 return map_location(x_base + x_modifier - offset, y_base + y_modifier - offset);
628 if(r.w <= 0 || r.h <= 0) {
630 return {0, -1, {0, 0}, {0, 0}};
646 static_cast<int>(std::floor(-
border + x / tile_width - 0.3333333)),
650 static_cast<int>(std::floor(-
border + (x + r.w - 1) / tile_width)),
660 static_cast<int>(std::floor(-
border + (y + r.h - 1) /
tile_size - 0.5))
712 }
else if(loc.
x >=
context().map().
w()) {
718 }
else if(loc.
y >=
context().map().
h()) {
727 if (!map_screenshot) {
728 LOG_DP <<
"taking ordinary screenshot";
733 ERR_DP <<
"No map loaded, cannot create a map screenshot.";
743 if (area.w > 1 << 16 || area.h > 1 << 16) {
744 WRN_DP <<
"Excessively large map screenshot area";
746 LOG_DP <<
"creating " << area.w <<
" by " << area.h
747 <<
" texture for map screenshot";
748 texture output_texture(area.w, area.h, SDL_TEXTUREACCESS_TARGET);
754 DBG_DP <<
"invalidating region for map screenshot";
757 DBG_DP <<
"drawing map screenshot";
766 LOG_DP <<
"reading pixels for map screenshot";
792 DBG_DP <<
"positioning menu buttons...";
796 b->set_location(loc);
797 b->set_measurements(0,0);
798 b->set_label(menu.title());
799 b->set_image(menu.image());
803 DBG_DP <<
"positioning action buttons...";
807 b->set_location(loc);
808 b->set_measurements(0,0);
809 b->set_label(action.title());
810 b->set_image(action.image());
819 if(
type ==
"checkbox") {
821 }
else if(
type ==
"image") {
823 }
else if(
type ==
"radiobox") {
825 }
else if(
type ==
"turbo") {
839 using namespace std::literals::string_literals;
840 static const std::array dirs{
"-n"s,
"-ne"s,
"-se"s,
"-s"s,
"-sw"s,
"-nw"s};
841 return dirs[
n >= dirs.size() ? 0 :
n];
852 std::vector<std::shared_ptr<gui::button>> menu_work;
853 std::vector<std::shared_ptr<gui::button>> action_work;
855 DBG_DP <<
"creating menu buttons...";
857 if(!menu.is_button()) {
864 DBG_DP <<
"drawing button " << menu.get_id();
865 b->set_id(menu.get_id());
866 if(!menu.tooltip().empty()) {
867 b->set_tooltip_string(menu.tooltip());
871 b->enable(b_prev->enabled());
874 menu_work.push_back(std::move(
b));
877 DBG_DP <<
"creating action buttons...";
879 auto b = std::make_shared<gui::button>(action.title(), string_to_button_type(action.type()),
882 DBG_DP <<
"drawing button " << action.get_id();
883 b->set_id(action.get_id());
884 if(!action.tooltip(0).empty()) {
885 b->set_tooltip_string(action.tooltip(0));
889 b->enable(b_prev->enabled());
891 b->set_check(b_prev->checked());
895 action_work.push_back(std::move(
b));
907 DBG_DP <<
"buttons created";
955 std::vector<std::string>
names;
958 enum visibility { FOG = 0, SHROUD = 1, CLEAR = 2 };
959 std::array<visibility, 6> tiles;
963 for(
int i = 0;
i < 6; ++
i) {
973 for(
int v = FOG; v != CLEAR; ++v) {
977 if(tiles[
start] != v) {
985 const std::string name = *image_prefix[v] +
"-all.png";
987 names.push_back(name);
997 for(
int i = (
start + 1) % 6, cap1 = 0;
i !=
start && cap1 != 6; ++cap1) {
999 std::ostringstream stream;
1001 stream << *image_prefix[v];
1003 for(
int cap2 = 0; v == tiles[
i] && cap2 != 6;
i = (
i + 1) % 6, ++cap2) {
1014 name = stream.str();
1019 names.push_back(name +
".png");
1028 std::vector<texture> res;
1030 for(
const std::string& name :
names) {
1032 res.push_back(std::move(tex));
1048 std::array<
const time_of_day*, adjs.size()> atods;
1050 for(std::size_t
d = 0;
d < adjs.size(); ++
d) {
1054 for(
int d = 0;
d < 6; ++
d) {
1086 for(
int d = 0;
d < 6; ++
d) {
1118 for(
int d = 0;
d < 6; ++
d) {
1165 for(
const auto& terrain : *terrains) {
1173 const bool off_map = (
image.get_filename() == off_map_name
1174 ||
image.get_modifications().find(
"NO_TOD_SHIFT()") != std::string::npos);
1178 }
else if(lt.empty()) {
1193 constexpr std::array layer_groups {
1208 BITS_FOR_LAYER_GROUP = 4,
1214 BITS_FOR_X_PARITY = 1,
1220 BITS_FOR_X_OVER_2 = 9,
1222 SHIFT_LAYER = BITS_FOR_X_OVER_2,
1224 SHIFT_X_PARITY = BITS_FOR_LAYER + SHIFT_LAYER,
1226 SHIFT_Y = BITS_FOR_X_PARITY + SHIFT_X_PARITY,
1228 SHIFT_LAYER_GROUP = BITS_FOR_Y + SHIFT_Y
1234 uint32_t group_i = layer_groups.size() - 1;
1237 while(layer < layer_groups[group_i]) {
1245 const uint32_t x_parity =
static_cast<uint32_t
>(loc.
x) & 1;
1248 static_assert(SHIFT_LAYER_GROUP + BITS_FOR_LAYER_GROUP ==
sizeof(key) * 8,
"Bit field too small");
1250 key = (group_i << SHIFT_LAYER_GROUP) | (static_cast<uint32_t>(loc.
y + MAX_BORDER) << SHIFT_Y);
1251 key |= (x_parity << SHIFT_X_PARITY);
1252 key |= (
static_cast<uint32_t
>(layer) << SHIFT_LAYER) |
static_cast<uint32_t
>(loc.
x + MAX_BORDER) / 2;
1265 DBG_DP <<
"committing drawing buffer"
1286 std::invoke(helper.do_draw, helper.dest);
1294 return frametime > 0ms ? 1
s / frametime : 999u;
1300 constexpr
int sample_freq = 10;
1325 *fps_log << min <<
"," << avg <<
"," << max <<
"\n";
1336 std::ostringstream stream;
1337 #ifdef __cpp_lib_format
1338 stream <<
"<tt> " <<
std::format(
"{:<5}|{:<5}|{:<5}|{:<5}",
"min",
"avg",
"max",
"act") <<
"</tt>\n";
1339 stream <<
"<tt>FPS: " <<
std::format(
"{:<5}|{:<5}|{:<5}|{:<5}", min_fps, avg_fps, max_fps,
fps_actual_) <<
"</tt>\n";
1340 stream <<
"<tt>Time: " <<
std::format(
"{:5}|{:5}|{:5}", *max_iter, render_avg, *min_iter) <<
"</tt>\n";
1342 stream <<
"<tt> min |avg |max |act </tt>\n";
1343 stream <<
"<tt>FPS: " << std::left << std::setfill(
' ') << std::setw(5) << min_fps <<
'|' << std::setw(5) << avg_fps <<
'|' << std::setw(5) << max_fps <<
'|' << std::setw(5) <<
fps_actual_ <<
"</tt>\n";
1344 stream <<
"<tt>Time: " << std::left << std::setfill(
' ') << std::setw(5) << max_iter->count() <<
'|' << std::setw(5) << render_avg.count() <<
'|' << std::setw(5) << min_iter->count() <<
"</tt>\n";
1348 stream <<
"\nhex: " <<
drawn_hexes_ * 1.0 / sample_freq;
1382 if (panel.
image().empty()) {
1392 DBG_DP <<
"drawing panel " << panel.
get_id() <<
' ' << loc;
1397 <<
" texture: " << panel.
image();
1412 const std::string& text =
label.text();
1414 const std::string& icon =
label.icon();
1416 DBG_DP <<
"drawing label " <<
label.get_id() <<
' ' << loc;
1418 if(icon.empty() ==
false) {
1421 if(text.empty() ==
false) {
1424 }
else if(text.empty() ==
false) {
1426 text_color, text, loc.x, loc.y
1455 const std::string& text,
1456 std::size_t font_size,
1461 if (text.empty())
return;
1467 renderer.set_maximum_height(-1,
false);
1468 renderer.set_foreground_color(color);
1472 draw::blit(tex, rect{ dest.point_at(x_in_hex, y_in_hex) - tex.draw_size() / 2, tex.draw_size() });
1514 auto now = std::chrono::steady_clock::now();
1531 if((*i)->pressed()) {
1547 if((*i)->pressed()) {
1635 double shift_x = -
border *
hex_width() - (map_out_rect.w - map_rect.w) / 2;
1636 double shift_y = -(
border + 0.25) *
hex_size() - (map_out_rect.h - map_rect.h) / 2;
1640 int view_w =
static_cast<int>(map_out_rect.w * xscaling);
1641 int view_h =
static_cast<int>(map_out_rect.h * yscaling);
1660 for(
const auto& u :
context().units()) {
1661 if (
fogged(u.get_location()) ||
1663 u.invisible(u.get_location())) ||
1668 int side = u.side();
1671 if(!
prefs::get().minimap_movement_coding()) {
1683 double u_x = u.get_location().x * xscaling;
1684 double u_y = (u.get_location().y + (
is_odd(u.get_location().x) ? 1 : -1)/4.0) * yscaling;
1686 double u_w = 4.0 / 3.0 * xscaling;
1687 double u_h = yscaling;
1692 , int(std::round(u_w))
1693 , int(std::round(u_h))
1707 if(amount ==
point{}) {
1768 r.y = r.y + r.h + diff.y;
1771 r.h = std::abs(diff.y);
1779 r.x = r.x + r.w + diff.x;
1782 r.w = std::abs(diff.x);
1817 LOG_DP <<
"new_zoom = " << new_zoom;
1819 if(new_zoom ==
zoom_) {
1823 if(validate_value_and_set_index) {
1828 if((new_zoom / 4) * 4 != new_zoom) {
1829 WRN_DP <<
"set_zoom forcing zoom " << new_zoom
1830 <<
" which is not a multiple of 4."
1831 <<
" This will likely cause graphical glitches.";
1838 double zoom_factor =
static_cast<double>(new_zoom) /
static_cast<double>(
zoom_);
1893 return x + hs >= area.x - hw && x < area.x + area.w + hw &&
1894 y + hs >= area.y - hs && y < area.y + area.h + hs;
1921 const double dist_total = std::hypot(move.x, move.y);
1922 double dist_moved = 0.0;
1924 using fractional_seconds = std::chrono::duration<double>;
1925 auto prev_time = std::chrono::steady_clock::now();
1927 double velocity = 0.0;
1928 while (dist_moved < dist_total) {
1931 auto time = std::chrono::steady_clock::now();
1932 auto dt = std::chrono::duration_cast<fractional_seconds>(time - prev_time);
1935 dt = std::min<fractional_seconds>(dt, 200ms);
1938 const double dt_as_double = dt.count();
1944 double accel = velocity_max / accel_time;
1945 double decel = velocity_max / decel_time;
1948 double stop_time = velocity / decel;
1949 double dist_stop = dist_moved + velocity*stop_time - 0.5*decel*stop_time*stop_time;
1950 if (dist_stop > dist_total || velocity > velocity_max) {
1951 velocity -= decel * dt_as_double;
1952 if (velocity < 1.0) velocity = 1.0;
1954 velocity += accel * dt_as_double;
1955 if (velocity > velocity_max) velocity = velocity_max;
1958 dist_moved += velocity * dt_as_double;
1959 if (dist_moved > dist_total) dist_moved = dist_total;
1962 std::round(move.x * dist_moved / dist_total),
1963 std::round(move.y * dist_moved / dist_total)
1966 point diff = next_pos - prev_pos;
1977 if(
context().map().on_board(loc) ==
false) {
1978 ERR_DP <<
"Tile at " << loc <<
" isn't on the map, can't scroll to the tile.";
1987 double add_spacing,
bool force)
1989 scroll_to_tiles({loc1, loc2}, scroll_type, check_fogged,
false, add_spacing, force);
1994 bool only_if_possible,
double add_spacing,
bool force)
2004 if(
context().map().on_board(loc) ==
false)
continue;
2005 if(check_fogged &&
fogged(loc))
continue;
2016 int minx_new = std::min<int>(minx,x);
2017 int miny_new = std::min<int>(miny,y);
2018 int maxx_new = std::max<int>(maxx,x);
2019 int maxy_new = std::max<int>(maxy,y);
2025 if (only_if_possible)
return;
2038 int spacing = std::round(add_spacing *
hex_size());
2049 locs_bbox.w = maxx - minx +
hex_size();
2050 locs_bbox.h = maxy - miny +
hex_size();
2058 auto [map_center_x, map_center_y] = r.
center();
2064 double inside_frac = 0.5;
2065 w =
static_cast<int>(
w * inside_frac);
2066 h =
static_cast<int>(
h * inside_frac);
2076 r.x = target.x -
w/2;
2077 r.y = target.y -
h/2;
2085 if (map_center_x < r.x) {
2087 target.y = std::clamp(map_center_y, r.y, r.y + r.h - 1);
2088 }
else if (map_center_x > r.x+r.w-1) {
2089 target.x = r.x + r.w - 1;
2090 target.y = std::clamp(map_center_y, r.y, r.y + r.h - 1);
2091 }
else if (map_center_y < r.y) {
2093 target.x = std::clamp(map_center_x, r.x, r.x + r.w - 1);
2094 }
else if (map_center_y > r.y+r.h-1) {
2095 target.y = r.y + r.h - 1;
2096 target.x = std::clamp(map_center_x, r.x, r.x + r.w - 1);
2098 ERR_DP <<
"Bug in the scrolling code? Looks like we would not need to scroll after all...";
2121 xpos = std::clamp(xpos, 0, xend -
map_area().
w);
2122 ypos = std::clamp(ypos, 0, yend -
map_area().
h);
2128 if(
keys_[SDLK_LSHIFT] ||
keys_[SDLK_RSHIFT]) {
2156 if(submerge <= 0.0) {
2161 data.unsub_dest = dest;
2162 const int dest_sub_h = dest.h * submerge;
2163 data.unsub_dest.h -= dest_sub_h;
2164 const int dest_y_mid = dest.y +
data.unsub_dest.h;
2167 const int submersion_line =
size.y * (1.0 - submerge);
2168 data.unsub_src = {0, 0,
size.x, submersion_line};
2171 const color_t c_mid(255, 255, 255, 0.3 * alpha);
2172 const int pixels_submerged =
size.y * submerge;
2173 const int bot_alpha = std::max(0.3 - pixels_submerged * 0.015, 0.0) * alpha;
2174 const color_t c_bot(255, 255, 255, bot_alpha);
2175 const SDL_FPoint pML{float(dest.x), float(dest_y_mid)};
2176 const SDL_FPoint pMR{float(dest.x + dest.w), float(dest_y_mid)};
2177 const SDL_FPoint pBL{float(dest.x), float(dest.y + dest.h)};
2178 const SDL_FPoint pBR{float(dest.x + dest.w), float(dest.y + dest.h)};
2179 data.alpha_verts = {
2180 SDL_Vertex{pML, c_mid, {0.0, float(1.0 - submerge)}},
2181 SDL_Vertex{pMR, c_mid, {1.0, float(1.0 - submerge)}},
2182 SDL_Vertex{pBL, c_bot, {0.0, 1.0}},
2183 SDL_Vertex{pBR, c_bot, {1.0, 1.0}},
2187 for(SDL_Vertex& v :
data.alpha_verts) {
2188 v.tex_coord.x = 1.0 - v.tex_coord.x;
2192 for(SDL_Vertex& v :
data.alpha_verts) {
2193 v.tex_coord.y = 1.0 - v.tex_coord.y;
2201 const std::string& old_mask,
2202 const std::string& new_mask)
2209 auto start = std::chrono::steady_clock::now();
2210 for(
auto now =
start; now <
start + duration; now = std::chrono::steady_clock::now()) {
2211 float prop_f = float((now -
start).count()) / float(duration.count());
2225 auto start = std::chrono::steady_clock::now();
2230 if(fade_start.a == 0) {
2231 fade_start.r = fade_end.r;
2232 fade_start.g = fade_end.g;
2233 fade_start.b = fade_end.b;
2237 if(fade_end.a == 0) {
2238 fade_end.r = fade_start.r;
2239 fade_end.g = fade_start.g;
2240 fade_end.b = fade_start.b;
2244 for(
auto now =
start; now <
start + duration; now = std::chrono::steady_clock::now()) {
2245 float prop_f = float((now -
start).count()) / float(duration.count());
2266 DBG_DP <<
"redrawing everything";
2289 if(command_executor !=
nullptr) {
2333 DBG_DP <<
"display::draw denied";
2344 DBG_DP <<
"display::draw redraw background";
2350 if(!
context().map().empty()) {
2392 if (!
context().map().empty()) {
2397 DBG_DP <<
"draw() with invalidateAll";
2422 DBG_DP <<
"render prevented";
2441 DBG_DP <<
"draw prevented";
2476 DBG_DP <<
"display::expose " << region;
2506 bool raw_size_changed =
size.x != oarea.w ||
size.y != oarea.h;
2507 bool draw_size_changed = dsize.x != darea.w || dsize.y != darea.h;
2508 if (!raw_size_changed && !draw_size_changed) {
2513 if(raw_size_changed) {
2514 LOG_DP <<
"regenerating render buffers as " << oarea;
2515 front_ =
texture(oarea.w, oarea.h, SDL_TEXTUREACCESS_TARGET);
2516 back_ =
texture(oarea.w, oarea.h, SDL_TEXTUREACCESS_TARGET);
2518 if(raw_size_changed || draw_size_changed) {
2519 LOG_DP <<
"updating render buffer draw size to " << darea;
2525 for(
int i = 0;
i < 2; ++
i) {
2542 for(
int i = 0;
i < 2; ++
i) {
2573 DBG_DP <<
"drawing " <<
invalidated_.size() <<
" invalidated hexes with clip " << clip_rect;
2576 utils::optional<unit_drawer> drawer{};
2577 if(!
context().teams().empty()) {
2578 drawer.emplace(*
this);
2583 if(!hex_rect.
overlaps(clip_rect)) {
2593 drawer->redraw_unit(*u_it);
2608 int num_images_fg = 0;
2609 int num_images_bg = 0;
2649 if(
context().map().is_village(loc)) {
2657 const std::string& tod_hex_mask = tod.
image_mask;
2666 }
else if(!tod_hex_mask.empty()) {
2673 std::vector<texture> to_draw;
2674 for(
const arrow* a : arrows_in_hex->second) {
2689 const auto get_variant = [&loc](
const std::vector<std::string>& variants) ->
const auto& {
2690 return variants[std::abs(loc.
x + loc.
y) % variants.size()];
2707 using namespace std::string_literals;
2722 std::ostringstream ss;
2732 ss << (num_images_bg + num_images_fg) <<
'\n';
2735 std::string
output = ss.str();
2745 renderer.set_alignment(PANGO_ALIGN_CENTER);
2747 renderer.set_maximum_height(-1,
false);
2752 const rect text_dest { dest.center() - tex.draw_size() / 2, tex.draw_size() };
2770 std::vector<overlay>& overlays = it->second;
2771 if(overlays.empty()) {
2780 for(
const overlay& ov : overlays) {
2781 if(
fogged(loc) && !ov.visible_in_fog) {
2789 bool item_visible_for_team = std::find_first_of(team_names.begin(), team_names.end(),
2790 current_team_names.begin(), current_team_names.end()) != team_names.end();
2792 if(!item_visible_for_team) {
2797 texture tex = ov.image.find(
"~NO_TOD_SHIFT()") == std::string::npos
2806 if(ovr_sub > 0.0 && ter_sub > 0.0) {
2808 double submerge = ter_sub * ovr_sub;
2811 = this->get_submerge_data(dest, submerge, tex.draw_size(), ALPHA_OPAQUE, false, false);
2816 tex.set_src(data.unsub_src);
2819 draw::smooth_shaded(tex, data.alpha_verts);
2822 draw::blit(tex, data.unsub_dest);
2825 draw::blit(tex, dest);
2857 if ( new_cfg ==
nullptr )
2858 new_cfg = &generated_cfg;
2865 if (loc == new_loc && report == *new_cfg) {
2869 DBG_DP <<
"updating report: " << report_name;
2883 if (report.
empty())
return;
2888 std::string str = item->
prefix();
2919 int x = loc.x, y = loc.y;
2923 int image_count = 0;
2924 bool used_ellipsis =
false;
2925 std::ostringstream ellipsis_tooltip;
2926 rect ellipsis_area = loc;
2929 elements.begin() != elements.end(); elements.pop_front())
2931 rect area {x, y, loc.w + loc.x - x, loc.h + loc.y - y};
2932 if (area.h <= 0)
break;
2934 std::string
t = elements.front()[
"text"];
2937 if (used_ellipsis)
goto skip_element;
2942 if (
t[
t.size() - 1] ==
'\n') {
2944 t =
t.substr(0,
t.size() - 1);
2968 const int minimal_text = 12;
2970 if (!eol && loc.w - (x - loc.x + tsize.x) < minimal_text &&
2971 ++ee != elements.end() && !(*ee)[
"text"].empty())
2980 used_ellipsis =
true;
2981 ellipsis_area.x = x;
2982 ellipsis_area.y = y;
2983 ellipsis_area.w = tsize.x;
2984 ellipsis_area.h = tsize.y;
2989 if (!tooltip_test) {
2992 if (area.h > tallest) {
3003 else if (!(
t = elements.front()[
"image"].str()).empty())
3005 if (used_ellipsis)
goto skip_element;
3011 ERR_DP <<
"could not find image for report: '" <<
t <<
"'";
3015 if (area.w <
img.w() && image_count) {
3018 used_ellipsis =
true;
3021 if (
img.w() < area.w) area.w =
img.w();
3022 if (
img.h() < area.h) area.h =
img.h();
3023 if (!tooltip_test) {
3028 if (area.h > tallest) {
3032 if (!used_ellipsis) {
3035 ellipsis_area = area;
3045 t = elements.front()[
"tooltip"].t_str().c_str();
3047 if (tooltip_test && !used_ellipsis) {
3053 ellipsis_tooltip <<
t;
3055 if (++ee != elements.end())
3056 ellipsis_tooltip <<
"\n _________\n\n";
3061 if (tooltip_test && used_ellipsis) {
3070 const std::string& name = it.first;
3082 DBG_DP <<
"invalidate_all()";
3116 bool result =
false;
3119 std::set<map_location>::const_iterator
i = locs.begin();
3122 if (
i != locs.end()) {
3145 DBG_DP <<
"invalidating locations in " <<
rect;
3147 bool result =
false;
3157 if(
context().map().is_village(loc)) {
3159 if(owner >= 0 &&
flags_[owner].need_update()
3175 if(
builder_->update_animation(loc)) {
3184 u.anim_comp().refresh();
3187 u->anim_comp().refresh();
3194 new_inval |= u.anim_comp().invalidate(*
this);
3197 new_inval |= u->anim_comp().invalidate(*
this);
3207 u.anim_comp().set_standing();
3268 if (reach != full.end()) {
void new_animation_frame()
Arrows destined to be drawn on the map.
std::vector< std::string > names
Definitions for the terrain builder.
void add_frame(const std::chrono::milliseconds &duration, const T &value, bool force_change=false)
Adds a frame to an animation.
Arrows destined to be drawn on the map.
const arrow_path_t & get_previous_path() const
const arrow_path_t & get_path() const
image::locator get_image_for_loc(const map_location &hex) const
color_t rep() const
High-contrast shade, intended for the minimap markers.
A config object defines a single node in a WML file, with access to child nodes.
config & mandatory_child(config_key_type key, int n=0)
Returns the nth child with the given key, or throws an error if there is none.
config & add_child_at(config_key_type key, const config &val, std::size_t index)
child_itors child_range(config_key_type key)
boost::iterator_range< const_child_iterator > const_child_itors
config & add_child(config_key_type key)
Abstract class for exposing game data that doesn't depend on the GUI, however which for historical re...
orb_status unit_orb_status(const unit &u) const
Returns an enumurated summary of whether this unit can move and/or attack.
int village_owner(const map_location &loc) const
Given the location of a village, will return the 1-based number of the team that currently owns it,...
virtual const gamemap & map() const =0
virtual const std::vector< team > & teams() const =0
virtual const unit_map & units() const =0
Sort-of-Singleton that many classes, both GUI and non-GUI, use to access the game data.
const team & viewing_team() const
void unhide_buttons()
Unhide theme buttons so they draw again.
void set_viewing_team_index(std::size_t team, bool observe=false)
Sets the team controlled by the player using the computer.
bool map_screenshot_
Used to indicate to drawing functions that we are doing a map screenshot.
void draw_text_in_hex(const map_location &loc, const drawing_layer layer, const std::string &text, std::size_t font_size, color_t color, double x_in_hex=0.5, double y_in_hex=0.5)
Draw text on a hex.
void update_render_textures()
Ensure render textures are valid and correct.
static unsigned int last_zoom_
The previous value of zoom_.
std::size_t viewing_team_index_
void write(config &cfg) const
static bool zoom_at_min()
void get_terrain_images(const map_location &loc, const std::string &timeid, TERRAIN_TYPE terrain_type)
void remove_overlay(const map_location &loc)
remove_overlay will remove all overlays on a tile.
map_location selectedHex_
void recalculate_minimap()
Schedule the minimap for recalculation.
bool unit_can_draw_here(const map_location &loc, const unit &unit) const
Returns true if there is no exclusive draw request for loc, or if there is, that it's for unit.
void redraw_minimap()
Schedule the minimap to be redrawn.
point get_location(const map_location &loc) const
Functions to get the on-screen positions of hexes.
unsigned int fps_counter_
bool invalidate_locations_in_rect(const SDL_Rect &rect)
invalidate all hexes under the rectangle rect (in screen coordinates)
virtual void render() override
Update offscreen render buffers.
void remove_single_overlay(const map_location &loc, const std::string &toDelete)
remove_single_overlay will remove a single overlay from a tile
static bool outside_area(const SDL_Rect &area, const int x, const int y)
Check if the bbox of the hex at x,y has pixels outside the area rectangle.
boost::circular_buffer< std::chrono::milliseconds > frametimes_
void fade_tod_mask(const std::string &old, const std::string &new_)
ToD mask smooth fade.
bool add_exclusive_draw(const map_location &loc, const unit &unit)
Allows a unit to request to be the only one drawn in its hex.
bool invalidate(const map_location &loc)
Function to invalidate a specific tile for redrawing.
void set_playing_team_index(std::size_t team)
sets the team whose turn it currently is
const team & playing_team() const
void announce(const std::string &msg, const color_t &color=font::GOOD_COLOR, const announce_options &options=announce_options())
Announce a message prominently.
double turbo_speed() const
int current_frame_sample_
void scroll_to_xy(const point &screen_coordinates, SCROLL_TYPE scroll_type, bool force=true)
int invalidated_hexes_
Count work done for the debug info displayed under fps.
void adjust_color_overlay(int r, int g, int b)
Add r,g,b to the colors for all images displayed on the map.
void set_fade(const color_t &color)
void queue_repaint()
Queues repainting to the screen, but doesn't rerender.
static int hex_size()
Function which returns the size of a hex in pixels (from top tip to bottom tip or left edge to right ...
static double get_zoom_factor()
Returns the current zoom factor.
const rect & unit_image_area() const
bool propagate_invalidation(const std::set< map_location > &locs)
If this set is partially invalidated, invalidate all its hexes.
void clear_redraw_observers()
Clear the redraw observers.
void invalidate_game_status()
Function to invalidate the game status displayed on the sidebar.
const theme::action * action_pressed()
static submerge_data get_submerge_data(const rect &dest, double submerge, const point &size, uint8_t alpha, bool hreverse, bool vreverse)
std::shared_ptr< gui::button > find_action_button(const std::string &id)
Retrieves a pointer to a theme UI button.
void set_theme(const std::string &new_theme)
void rebuild_all()
Rebuild all dynamic terrain.
void change_display_context(const display_context *dc)
void add_redraw_observer(std::function< void(display &)> f)
Adds a redraw observer, a function object to be called when a full rerender is queued.
void set_prevent_draw(bool pd=true)
Prevent the game display from drawing.
virtual overlay_map & get_overlays()=0
virtual void layout() override
Finalize screen layout.
virtual void highlight_hex(map_location hex)
void update_tod(const time_of_day *tod_override=nullptr)
Applies r,g,b coloring to the map.
static bool zoom_at_max()
static display * singleton_
std::shared_ptr< gui::button > find_menu_button(const std::string &id)
void render_map_outside_area()
Draw/redraw the off-map background area.
std::size_t playing_team_index() const
The playing team is the team whose turn it is.
void remove_arrow(arrow &)
@ DEBUG_COORDINATES
Overlays x,y coords on tiles.
@ DEBUG_BENCHMARK
Toggle to continuously redraw the whole map.
@ __NUM_DEBUG_FLAGS
Dummy entry to size the bitmask.
@ DEBUG_NUM_BITMAPS
Overlays number of bitmaps on tiles.
@ DEBUG_FOREGROUND
Separates background and foreground terrain layers.
@ DEBUG_TERRAIN_CODES
Overlays terrain codes on tiles.
void process_reachmap_changes()
void draw_minimap_units()
void scroll_to_tile(const map_location &loc, SCROLL_TYPE scroll_type=ONSCREEN, bool check_fogged=true, bool force=true)
Scroll such that location loc is on-screen.
map_location pixel_position_to_hex(int x, int y) const
given x,y co-ordinates of a pixel on the map, will return the location of the hex that this pixel cor...
void invalidate_animations_location(const map_location &loc)
Per-location invalidation called by invalidate_animations() Extra game per-location invalidation (vil...
map_location mouseoverHex_
bool fogged(const map_location &loc) const
Returns true if location (x,y) is covered in fog.
bool set_zoom(bool increase)
Zooms the display in (true) or out (false).
std::map< std::string, rect > reportLocations_
const rect_of_hexes get_visible_hexes() const
Returns the rectangular area of visible hexes.
void draw_overlays_at(const map_location &loc)
std::chrono::steady_clock::time_point fps_start_
texture get_flag(const map_location &loc)
void invalidate_all()
Function to invalidate all tiles.
std::map< std::string, config > reports_
std::bitset< __NUM_DEBUG_FLAGS > debug_flags_
Currently set debug flags.
SDL_Rect minimap_location_
point viewport_origin_
Position of the top-left corner of the viewport, in pixels.
map_location get_middle_location() const
void bounds_check_position()
std::function< rect(rect)> minimap_renderer_
surface screenshot(bool map_screenshot=false)
Capture a (map-)screenshot into a surface.
void init_flags()
Init the flag list and the team colors used by ~TC.
std::vector< std::shared_ptr< gui::button > > action_buttons_
void drawing_buffer_add(const drawing_layer layer, const map_location &loc, decltype(draw_helper::do_draw) draw_func)
Add an item to the drawing buffer.
rect map_outside_area() const
Returns the available area for a map, this may differ from the above.
exclusive_unit_draw_requests_t exclusive_unit_draw_requests_
map of hexes where only one unit should be drawn, the one identified by the associated id string
bool tile_nearly_on_screen(const map_location &loc) const
Checks if location loc or one of the adjacent tiles is visible on screen.
void reload_map()
Updates internals that cache map size.
rect max_map_area() const
Returns the maximum area used for the map regardless to resolution and view size.
bool tile_fully_on_screen(const map_location &loc) const
Check if a tile is fully visible on screen.
map_location minimap_location_on(int x, int y)
given x,y co-ordinates of the mouse, will return the location of the hex in the minimap that the mous...
void scroll_to_tiles(map_location loc1, map_location loc2, SCROLL_TYPE scroll_type=ONSCREEN, bool check_fogged=true, double add_spacing=0.0, bool force=true)
Scroll such that location loc1 is on-screen.
bool is_blindfolded() const
std::vector< texture > terrain_image_vector_
std::vector< std::string > fog_images_
void fade_to(const color_t &color, const std::chrono::milliseconds &duration)
Screen fade.
int fps_handle_
Handle for the label which displays frames per second.
const display_context & context() const
bool invalidate_visible_locations_in_rect(const SDL_Rect &rect)
std::map< map_location, std::list< arrow * > > arrows_map_
Maps the list of arrows for each location.
void add_overlay(const map_location &loc, overlay &&ov)
Functions to add and remove overlays from locations.
std::vector< std::function< void(display &)> > redraw_observers_
void read(const config &cfg)
const theme::menu * menu_pressed()
const rect_of_hexes hexes_under_rect(const rect &r) const
Return the rectangular area of hexes overlapped by r (r is in screen coordinates)
const std::unique_ptr< terrain_builder > builder_
std::vector< animated< image::locator > > flags_
Animated flags for each team.
rect get_location_rect(const map_location &loc) const
Returns the on-screen rect corresponding to a loc.
static void fill_images_list(const std::string &prefix, std::vector< std::string > &images)
void draw_report(const std::string &report_name, bool test_run=false)
Draw the specified report.
std::set< map_location > invalidated_
virtual const time_of_day & get_time_of_day(const map_location &loc=map_location::null_location()) const =0
std::vector< texture > get_fog_shroud_images(const map_location &loc, image::TYPE image_type)
void queue_rerender()
Marks everything for rendering including all tiles and sidebar.
std::string remove_exclusive_draw(const map_location &loc)
Cancels an exclusive draw request.
bool invalidateGameStatus_
virtual void draw_invalidated()
Only called when there's actual redrawing to do.
void drawing_buffer_commit()
Draws the drawing_buffer_ and clears it.
rect map_area() const
Returns the area used for the map.
void draw_panel(const theme::panel &panel)
static int hex_width()
Function which returns the width of a hex in pixels, up to where the next hex starts.
void reset_standing_animations()
utils::optional< std::chrono::steady_clock::time_point > last_frame_finished_
bool animate_water_
Local version of prefs::get().animate_water, used to detect when it's changed.
bool debug_flag_set(DEBUG_FLAG flag) const
void toggle_default_zoom()
Sets the zoom amount to the default.
virtual rect get_clip_rect() const
Get the clipping rectangle for drawing.
reports * reports_object_
bool draw_reports(const rect ®ion)
Draw all reports in the given region.
void invalidate_animations()
Function to invalidate animated terrains and units which may have changed.
virtual rect screen_location() override
Return the current draw location of the display, on the screen.
void hide_buttons()
Hide theme buttons so they don't draw.
virtual bool expose(const rect ®ion) override
Paint the indicated region to the screen.
std::list< draw_helper > drawing_buffer_
std::vector< std::shared_ptr< gui::button > > menu_buttons_
virtual void update() override
Update animations and internal state.
void draw()
Perform rendering of invalidated items.
const rect & minimap_area() const
mapx is the width of the portion of the display which shows the game area.
events::generic_event scroll_event_
Event raised when the map is being scrolled.
bool show_everything() const
virtual void draw_hex(const map_location &loc)
Redraws a single gamemap location.
const rect & palette_area() const
std::map< map_location, unsigned int > reach_map
std::size_t playing_team_index_
std::vector< std::tuple< int, int, int > > fps_history_
void reinit_flags_for_team(const team &)
Rebuild the flag list (not team colors) for a single side.
void draw_minimap()
Actually draw the minimap.
texture front_
Render textures, for intermediate rendering.
std::size_t viewing_team_index() const
The viewing team is the team currently viewing the game.
map_location hex_clicked_on(int x, int y) const
given x,y co-ordinates of an onscreen pixel, will return the location of the hex that this pixel corr...
void update_arrow(arrow &a)
Called by arrow objects when they change.
void draw_label(const theme::label &label)
const std::unique_ptr< fake_unit_manager > fake_unit_man_
const display_context * dc_
bool animate_map_
Local cache for prefs::get().animate_map, since it is constantly queried.
std::vector< std::string > shroud_images_
bool scroll(const point &amount, bool force=false)
Scrolls the display by amount pixels.
static unsigned int zoom_
The current zoom, in pixels (on screen) per 72 pixels (in the graphic assets), i.e....
bool shrouded(const map_location &loc) const
Returns true if location (x,y) is covered in shroud.
void blindfold(bool flag)
void refresh_report(const std::string &report_name, const config *new_cfg=nullptr)
Update the given report.
std::weak_ptr< wb::manager > wb_
const std::unique_ptr< map_labels > map_labels_
void set_diagnostic(const std::string &msg)
virtual void select_hex(map_location hex)
std::map< std::string, texture > reportSurfaces_
bool draw_all_panels(const rect ®ion)
Redraws all panels intersecting the given region.
display(const display_context *dc, std::weak_ptr< wb::manager > wb, reports &reports_object, const std::string &theme_id, const config &level)
virtual void notify_observers()
Manages a list of fake units for the display object.
void set_position(double xpos, double ypos)
void set_alignment(ALIGN align)
void set_lifetime(const std::chrono::milliseconds &lifetime, const std::chrono::milliseconds &fadeout=std::chrono::milliseconds{100})
void set_color(const color_t &color)
void set_border_size(int border)
void set_clip_rect(const SDL_Rect &r)
void set_bg_color(const color_t &bg_color)
void set_font_size(int font_size)
pango_text & set_font_style(const FONT_STYLE font_style)
point get_size()
Returns the size of the text, in drawing coordinates.
pango_text & set_characters_per_line(const unsigned characters_per_line)
pango_text & set_foreground_color(const color_t &color)
pango_text & set_family_class(font::family_class fclass)
pango_text & set_ellipse_mode(const PangoEllipsizeMode ellipse_mode)
pango_text & set_alignment(const PangoAlignment alignment)
pango_text & set_font_size(unsigned font_size)
pango_text & set_link_aware(bool b)
bool set_text(const std::string &text, const bool markedup)
Sets the text to render.
pango_text & set_maximum_height(int height, bool multiline)
pango_text & set_maximum_width(int width)
texture render_and_get_texture()
Returns the cached texture, or creates a new one otherwise.
terrain_code get_terrain(const map_location &loc) const
Looks up terrain at a particular location.
int w() const
Effective map width.
int h() const
Effective map height.
bool on_board(const map_location &loc) const
Tell if a location is on the map.
const terrain_type & get_terrain_info(const t_translation::terrain_code &terrain) const
void update()
Process animations, remove deleted halos, and invalidate screen regions now requiring redraw.
void render(const rect &r)
Render halos in region.
virtual void set_button_state()
Generic locator abstracting the location of an image.
A RAII object to temporary leave the synced context like in wesnoth.synchronize_choice.
void recalculate_shroud()
void set_team(const team *)
void recalculate_labels()
events::mouse_handler & get_mouse_handler_base() override
Get a reference to a mouse handler member a derived class uses.
hotkey::command_executor * get_hotkey_command_executor() override
Optionally get a command executor to handle context menu events.
static rng & default_instance()
int get_random_int(int min, int max)
config generate_report(const std::string &name, const context &ct, bool only_static=false)
An object to leave the synced context during draw or unsynced wml items when we don’t know whether we...
This class stores all the data for a single 'side' (in game nomenclature).
static color_t get_minimap_color(int side)
bool shrouded(const map_location &loc) const
bool fogged(const map_location &loc) const
The class terrain_builder is constructed from a config object, and a gamemap object.
std::vector< animated< image::locator > > imagelist
A shorthand typedef for a list of animated image locators, the base data type returned by the get_ter...
TERRAIN_TYPE
Used as a parameter for the get_terrain_at function.
@ BACKGROUND
Represents terrains which are to be drawn behind unit sprites.
@ FOREGROUND
Represents terrains which are to be drawn in front of them.
double unit_submerge() const
Wrapper class to encapsulate creation and management of an SDL_Texture.
void reset()
Releases ownership of the managed texture and resets the ptr to null.
void set_src(const rect &r)
Set the source region of the texture used for drawing operations.
point draw_size() const
The size of the texture in draw-space.
void set_draw_size(int w, int h)
Set the intended size of the texture, in draw-space.
point get_raw_size() const
The raw internal texture size.
void set_alpha_mod(uint8_t alpha)
Alpha modifier.
void clear_src()
Clear the source region.
const std::string & get_id() const
virtual rect & location(const SDL_Rect &screen) const
const std::string & image() const
std::size_t font_size() const
const std::string & postfix() const
virtual rect & location(const SDL_Rect &screen) const
bool font_rgb_set() const
const std::string & prefix() const
const border_t & border() const
static NOT_DANGLING const config & get_theme_config(const std::string &id)
Returns the saved config for the theme with the given ID.
const rect & unit_image_location(const SDL_Rect &screen) const
const menu * get_menu_item(const std::string &key) const
const std::vector< action > & actions() const
const std::vector< menu > & menus() const
const rect & mini_map_location(const SDL_Rect &screen) const
const std::vector< panel > & panels() const
const rect & main_map_location(const SDL_Rect &screen) const
bool set_resolution(const SDL_Rect &screen)
const rect & palette_location(const SDL_Rect &screen) const
const status_item * get_status_item(const std::string &item) const
const std::vector< label > & labels() const
unit_iterator find(std::size_t id)
This class represents a single unit of a specific type.
constexpr uint8_t float_to_color(double n)
Convert a double in the range [0.0,1.0] to an 8-bit colour value.
void swap(config &lhs, config &rhs)
Implement non-member swap function for std::swap (calls config::swap).
static int get_zoom_levels_index(unsigned int zoom_level)
static unsigned calculate_fps(std::chrono::milliseconds frametime)
static lg::log_domain log_display("display")
map_display and display: classes which take care of displaying the map and game-data on the screen.
static SDL_Renderer * renderer()
Drawing functions, for drawing things on the screen.
@ border
The border of the map.
@ terrain_bg
Terrain drawn behind the unit.
@ reachmap
Overlay on unreachable hexes.
@ grid_bottom
Bottom half part of grid image.
@ unit_default
Default layer for drawing units.
@ unit_first
Reserve layers to be selected for wml.
@ terrain_fg
Terrain drawn in front of the unit.
@ fog_shroud
Fog and shroud.
@ unit_move_default
Default layer for drawing moving units.
@ arrows
Arrows from the arrows framework.
@ grid_top
Top half part of grid image.
Declarations for File-IO.
const std::string & id() const
Gets this unit's id.
std::string label
What to show in the filter's drop-down list.
std::string id
Text to match against addon_info.tags()
void get_adjacent_tiles(const map_location &a, map_location *res)
Function which, given a location, will place all adjacent locations in res.
static std::ostream & output()
Standard logging facilities (interface).
bool is_shrouded(const display *disp, const map_location &loc)
Our definition of map labels being obscured is if the tile is obscured, or the tile below is obscured...
constexpr bool is_odd(T num)
const std::string & get_direction(std::size_t n)
void invalidate_region(const rect ®ion)
Mark a region of the screen as requiring redraw.
void invalidate_all()
Mark the entire screen as requiring redraw.
render_target_setter set_render_target(const texture &t)
Set the given texture as the active render target.
clip_setter override_clip(const SDL_Rect &clip)
Override the clipping area.
clip_setter reduce_clip(const SDL_Rect &clip)
Set the clipping area to the intersection of the current clipping area and the given rectangle.
void tiled(const texture &tex, const SDL_Rect &dst, bool centered=false, bool mirrored=false)
Tile a texture to fill a region.
void fill(const SDL_Rect &rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a)
Fill an area with the given colour.
void blit(const texture &tex, const SDL_Rect &dst)
Draws a texture, or part of a texture, at the given location.
::rect get_clip()
Get the current clipping area, in draw coordinates.
void rect(const SDL_Rect &rect)
Draw a rectangle.
EXIT_STATUS start(bool clear_id, const std::string &filename, bool take_screenshot, const std::string &screenshot_filename)
Main interface for launching the editor from the title screen.
void draw()
Trigger a draw cycle.
void pump_and_draw()
pump() then immediately draw()
void pump()
Process all events currently in the queue.
std::string get_user_data_dir()
filesystem::scoped_ostream ostream_file(const std::string &fname, std::ios_base::openmode mode, bool create_directory)
const int SIZE_FLOAT_LABEL
const color_t YELLOW_COLOR
pango_text & get_text_renderer()
Returns a reference to a static pango_text object.
int add_floating_label(const floating_label &flabel)
add a label floating on the screen above everything else.
const int SIZE_BUTTON_SMALL
rect pango_draw_text(bool actually_draw, const rect &area, int size, const color_t &color, const std::string &text, int x, int y, bool use_tooltips, pango_text::FONT_STYLE style)
Draws text on the screen.
void scroll_floating_labels(double xmove, double ymove)
moves all floating labels that have 'scroll_mode' set to ANCHOR_LABEL_MAP
void remove_floating_label(int handle, const std::chrono::milliseconds &fadeout)
removes the floating label given by 'handle' from the screen
void update_floating_labels()
void draw_floating_labels()
const color_t NORMAL_COLOR
const color_range & color_info(std::string_view name)
std::string shroud_prefix
bool is_in_dialog()
Is a dialog open?
Functions to load and save images from/to disk.
bool exists(const image::locator &i_locator)
Returns true if the given image actually exists, without loading it.
std::function< rect(rect)> prep_minimap_for_rendering(const gamemap &map, const team *vw, const unit_map *units, const std::map< map_location, unsigned int > *reach_map, bool ignore_terrain_disabled)
Prepares the minimap texture and returns a function which will render it to the current rendering tar...
texture get_lighted_texture(const image::locator &i_locator, const light_string &ls)
std::basic_string< signed char > light_string
Type used to store color information of central and adjacent hexes.
TYPE
Used to specify the rendering format of images.
@ HEXED
Standard hexagonal tile mask applied, removing portions that don't fit.
@ TOD_COLORED
Same as HEXED, but with Time of Day color tint applied.
texture get_texture(const image::locator &i_locator, TYPE type, bool skip_cache)
Returns an image texture suitable for hardware-accelerated rendering.
void set_color_adjustment(int r, int g, int b)
Changes Time of Day color tint for all applicable image types.
light_string get_light_string(int op, int r, int g, int b)
Returns the light_string for one light operation.
std::string img(const std::string &src, const std::string &align, const bool floating)
std::string get_orb_color(orb_status os)
Wrapper for the various prefs::get().unmoved_color(), moved_color(), etc methods, using the enum inst...
Unit and team statistics.
::tod_manager * tod_manager
fake_unit_manager * fake_units
play_controller * controller
constexpr const SDL_Rect empty_rect
std::size_t index(const std::string &str, const std::size_t index)
Codepoint index corresponding to the nth character in a UTF-8 string.
std::size_t size(const std::string &str)
Length in characters of a UTF-8 string.
std::vector< std::string_view > split_view(std::string_view s, const char sep, const int flags)
void trim(std::string_view &s)
bool contains(const Container &container, const Value &value)
Returns true iff value is found in container.
void erase_if(Container &container, const Predicate &predicate)
Convenience wrapper for using std::remove_if on a container.
std::vector< std::string > square_parenthetical_split(const std::string &val, const char separator, const std::string &left, const std::string &right, const int flags)
Similar to parenthetical_split, but also expands embedded square brackets.
std::vector< std::string > split(const config_attribute_value &val)
bool headless()
The game is running headless.
surface read_pixels(SDL_Rect *r)
Copy back a portion of the render target that is already drawn.
rect game_canvas()
The game canvas area, in drawing coordinates.
int get_pixel_scale()
Get the current active pixel scale multiplier.
std::string::const_iterator iterator
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
@ allied
Belongs to a friendly side.
@ enemy
Belongs to a non-friendly side; normally visualised by not displaying an orb.
Transitional API for porting SDL_ttf-based code to Pango.
rect dst
Location on the final composed sheet.
rect src
Non-transparent portion of the surface to compose.
std::string filename
Filename.
The basic class for representing 8-bit RGB or RGBA colour values.
constexpr color_t smooth_blend(const color_t &c, uint8_t p) const
Blend smoothly with another color_t.
Holds options for calls to function 'announce' (announce).
bool discard_previous
An announcement according these options should replace the previous announce (typical of fast announc...
std::chrono::milliseconds lifetime
Lifetime measured in milliseconds.
Helper for rendering the map by ordering draw operations.
std::function< void(const rect &)> do_draw
Handles the actual drawing at this location.
very simple iterator to walk into the rect_of_hexes
iterator & operator++()
increment y first, then when reaching bottom, increment x
const rect_of_hexes & rect_
Rectangular area of hexes, allowing to decide how the top and bottom edges handles the vertical shift...
Encapsulates the map of the game.
void write(config &cfg) const
An abstract description of a rectangle with integer coordinates.
constexpr point center() const
The center point of the rectangle, accounting for origin.
bool empty() const
False if both w and h are > 0, true otherwise.
constexpr point origin() const
bool contains(int x, int y) const
Whether the given point lies within the rectangle.
constexpr rect padded_by(int dx, int dy) const
Returns a new rectangle with dx horizontal padding and dy vertical padding.
void clip(const SDL_Rect &r)
Clip this rectangle by the given rectangle.
constexpr point size() const
void shift(const point &p)
Shift the rectangle by the given relative position.
rect intersect(const SDL_Rect &r) const
Calculates the intersection of this rectangle and another; that is, the maximal rectangle that is con...
bool overlaps(const SDL_Rect &r) const
Whether the given rectangle and this rectangle overlap.
std::string background_image
Object which defines a time of day with associated bonuses, image, sounds etc.
tod_color color
The color modifications that should be made to the game board to reflect the time of day.
std::string image_mask
The image that is to be laid over all images while this time of day lasts.
Small struct to store and manipulate ToD color adjusts.
static map_location::direction n
static map_location::direction s