From d6b4824e6b54110fdf1fab514c1705971073c5bb Mon Sep 17 00:00:00 2001 From: Mike Nelson Date: Wed, 29 Apr 2026 13:25:28 -0500 Subject: [PATCH 1/2] Make showing 2D radar icons a toggle-able option --- code/localization/localize.cpp | 2 +- code/radar/radar.cpp | 2 +- code/radar/radardradis.cpp | 2 +- code/radar/radarorb.cpp | 2 +- code/radar/radarsetup.cpp | 23 +++++++++++++++++++++++ code/radar/radarsetup.h | 3 +++ code/ship/ship.cpp | 2 ++ 7 files changed, 32 insertions(+), 4 deletions(-) diff --git a/code/localization/localize.cpp b/code/localization/localize.cpp index 96c0c9b992c..8bb0f79f17f 100644 --- a/code/localization/localize.cpp +++ b/code/localization/localize.cpp @@ -64,7 +64,7 @@ bool *Lcl_unexpected_tstring_check = nullptr; // NOTE: with map storage of XSTR strings, the indexes no longer need to be contiguous, // but internal strings should still increment XSTR_SIZE to avoid collisions. // retail XSTR_SIZE = 1570 -// #define XSTR_SIZE 1915 // This is the next available ID +// #define XSTR_SIZE 1917 // This is the next available ID // struct to allow for strings.tbl-determined x offset // offset is 0 for english, by default diff --git a/code/radar/radar.cpp b/code/radar/radar.cpp index 9bf32bf9ee2..aa5278cc26b 100644 --- a/code/radar/radar.cpp +++ b/code/radar/radar.cpp @@ -161,7 +161,7 @@ void HudGaugeRadarStd::drawBlips(int blip_type, int bright, int distort) } else { - if (b->radar_image_2d == -1 && b->radar_color_image_2d == -1) + if (!Radar_show_2d_icons || (b->radar_image_2d == -1 && b->radar_color_image_2d == -1)) drawContactCircle(x, y, b->rad); else drawContactImage(x, y, b->rad, b->radar_image_2d, b->radar_color_image_2d, b->radar_image_size); diff --git a/code/radar/radardradis.cpp b/code/radar/radardradis.cpp index 36450865d59..be6ea1dbb3e 100644 --- a/code/radar/radardradis.cpp +++ b/code/radar/radardradis.cpp @@ -319,7 +319,7 @@ void HudGaugeRadarDradis::drawBlips(int blip_type, int bright, int distort) } else { if (b->flags & BLIP_DRAW_DISTORTED) { blipDrawFlicker(b, &pos, alpha); - } else if (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0) { + } else if (Radar_show_2d_icons && (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0)) { drawContact(&pos, b->radar_image_2d, b->radar_color_image_2d, b->dist, alpha, scale_factor); } else { drawContact(&pos, -1, unknown_contact_icon, b->dist, alpha, scale_factor); diff --git a/code/radar/radarorb.cpp b/code/radar/radarorb.cpp index f8a51e46427..4a5406b0c4d 100644 --- a/code/radar/radarorb.cpp +++ b/code/radar/radarorb.cpp @@ -281,7 +281,7 @@ void HudGaugeRadarOrb::drawBlips(int blip_type, int bright, int distort) } else { - if (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0) + if (Radar_show_2d_icons && (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0)) { drawContactImage(&pos, b->rad, b->radar_image_2d, b->radar_color_image_2d, b->radar_projection_size); } diff --git a/code/radar/radarsetup.cpp b/code/radar/radarsetup.cpp index e8d2649ea0d..3faae86abb7 100644 --- a/code/radar/radarsetup.cpp +++ b/code/radar/radarsetup.cpp @@ -21,6 +21,7 @@ #include "localization/localize.h" #include "network/multi.h" #include "object/object.h" +#include "options/Option.h" #include "playerman/player.h" #include "radar/radar.h" #include "radar/radarorb.h" @@ -88,6 +89,28 @@ int See_all = 0; DCF_BOOL(see_all, See_all); +bool Radar_show_2d_icons = true; + +static auto RadarShow2dIconsOption __UNUSED = options::OptionBuilder("HUD.Radar2dIcons", + std::pair{"Show Radar 2D Icons", 1915}, + std::pair{"Enables or disables the display of custom 2D ship icons on the radar", 1916}) + .category(std::make_pair("Game", 1824)) + .default_val(true) + .bind_to(&Radar_show_2d_icons) + .importance(56) + .finish(); + +void radar_check_2d_icon_options() +{ + bool has_icons = std::any_of(Ship_info.begin(), Ship_info.end(), [](const ship_info& sip) { + return sip.radar_image_2d_idx >= 0 || sip.radar_color_image_2d_idx >= 0; + }); + + if (!has_icons) { + options::OptionsManager::instance()->removeOption(RadarShow2dIconsOption); + } +} + void radar_stuff_blip_info(object *objp, int is_bright, color **blip_color, int *blip_type) { ship *shipp = NULL; diff --git a/code/radar/radarsetup.h b/code/radar/radarsetup.h index b0d01a7478d..fbe986f894c 100644 --- a/code/radar/radarsetup.h +++ b/code/radar/radarsetup.h @@ -89,10 +89,13 @@ enum RadarVisibility DISTORTED //!< Visible but not fully }; +extern bool Radar_show_2d_icons; + void radar_frame_init(); void radar_mission_init(); void radar_plot_object( object *objp ); RadarVisibility radar_is_visible( object *objp ); +void radar_check_2d_icon_options(); extern sound_handle Radar_static_looping; diff --git a/code/ship/ship.cpp b/code/ship/ship.cpp index a5eb8acb665..091c8a3e1df 100644 --- a/code/ship/ship.cpp +++ b/code/ship/ship.cpp @@ -6752,6 +6752,8 @@ void ship_init() // We shouldn't already have any subsystem pointers at this point. Assertion(Ship_subsystems.empty(), "Some pre-allocated subsystems didn't get cleared out: " SIZE_T_ARG " batches present during ship_init(); get a coder!\n", Ship_subsystems.size()); + + radar_check_2d_icon_options(); } } From 76ac75a9789465bfc2019c20c638272b13cb636c Mon Sep 17 00:00:00 2001 From: Mike Nelson Date: Fri, 1 May 2026 23:41:23 -0500 Subject: [PATCH 2/2] better options --- code/localization/localize.cpp | 2 +- code/radar/radar.cpp | 4 +++- code/radar/radardradis.cpp | 10 +++++++--- code/radar/radarorb.cpp | 4 +++- code/radar/radarsetup.cpp | 17 ++++++++++------- code/radar/radarsetup.h | 7 ++++++- 6 files changed, 30 insertions(+), 14 deletions(-) diff --git a/code/localization/localize.cpp b/code/localization/localize.cpp index 8bb0f79f17f..207596154fa 100644 --- a/code/localization/localize.cpp +++ b/code/localization/localize.cpp @@ -64,7 +64,7 @@ bool *Lcl_unexpected_tstring_check = nullptr; // NOTE: with map storage of XSTR strings, the indexes no longer need to be contiguous, // but internal strings should still increment XSTR_SIZE to avoid collisions. // retail XSTR_SIZE = 1570 -// #define XSTR_SIZE 1917 // This is the next available ID +// #define XSTR_SIZE 1918 // This is the next available ID // struct to allow for strings.tbl-determined x offset // offset is 0 for english, by default diff --git a/code/radar/radar.cpp b/code/radar/radar.cpp index aa5278cc26b..1623054f2bd 100644 --- a/code/radar/radar.cpp +++ b/code/radar/radar.cpp @@ -161,7 +161,9 @@ void HudGaugeRadarStd::drawBlips(int blip_type, int bright, int distort) } else { - if (!Radar_show_2d_icons || (b->radar_image_2d == -1 && b->radar_color_image_2d == -1)) + bool show_icon = (Radar_2d_icon_mode == RadarIconMode::On || + (Radar_2d_icon_mode == RadarIconMode::TargetOnly && (b->flags & BLIP_CURRENT_TARGET))); + if (!show_icon || (b->radar_image_2d == -1 && b->radar_color_image_2d == -1)) drawContactCircle(x, y, b->rad); else drawContactImage(x, y, b->rad, b->radar_image_2d, b->radar_color_image_2d, b->radar_image_size); diff --git a/code/radar/radardradis.cpp b/code/radar/radardradis.cpp index be6ea1dbb3e..e6fe7668e43 100644 --- a/code/radar/radardradis.cpp +++ b/code/radar/radardradis.cpp @@ -319,10 +319,14 @@ void HudGaugeRadarDradis::drawBlips(int blip_type, int bright, int distort) } else { if (b->flags & BLIP_DRAW_DISTORTED) { blipDrawFlicker(b, &pos, alpha); - } else if (Radar_show_2d_icons && (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0)) { - drawContact(&pos, b->radar_image_2d, b->radar_color_image_2d, b->dist, alpha, scale_factor); } else { - drawContact(&pos, -1, unknown_contact_icon, b->dist, alpha, scale_factor); + bool show_icon = (Radar_2d_icon_mode == RadarIconMode::On || + (Radar_2d_icon_mode == RadarIconMode::TargetOnly && (b->flags & BLIP_CURRENT_TARGET))); + if (show_icon && (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0)) { + drawContact(&pos, b->radar_image_2d, b->radar_color_image_2d, b->dist, alpha, scale_factor); + } else { + drawContact(&pos, -1, unknown_contact_icon, b->dist, alpha, scale_factor); + } } } } diff --git a/code/radar/radarorb.cpp b/code/radar/radarorb.cpp index 4a5406b0c4d..988e59a5e48 100644 --- a/code/radar/radarorb.cpp +++ b/code/radar/radarorb.cpp @@ -281,7 +281,9 @@ void HudGaugeRadarOrb::drawBlips(int blip_type, int bright, int distort) } else { - if (Radar_show_2d_icons && (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0)) + bool show_icon = (Radar_2d_icon_mode == RadarIconMode::On || + (Radar_2d_icon_mode == RadarIconMode::TargetOnly && (b->flags & BLIP_CURRENT_TARGET))); + if (show_icon && (b->radar_image_2d >= 0 || b->radar_color_image_2d >= 0)) { drawContactImage(&pos, b->rad, b->radar_image_2d, b->radar_color_image_2d, b->radar_projection_size); } diff --git a/code/radar/radarsetup.cpp b/code/radar/radarsetup.cpp index 3faae86abb7..1f48e0a4a70 100644 --- a/code/radar/radarsetup.cpp +++ b/code/radar/radarsetup.cpp @@ -89,14 +89,17 @@ int See_all = 0; DCF_BOOL(see_all, See_all); -bool Radar_show_2d_icons = true; +RadarIconMode Radar_2d_icon_mode = RadarIconMode::On; -static auto RadarShow2dIconsOption __UNUSED = options::OptionBuilder("HUD.Radar2dIcons", - std::pair{"Show Radar 2D Icons", 1915}, - std::pair{"Enables or disables the display of custom 2D ship icons on the radar", 1916}) +static auto RadarIconModeOption __UNUSED = options::OptionBuilder("HUD.Radar2dIconMode", + std::pair{"Radar 2D Icons", 1915}, + std::pair{"Controls how custom 2D ship icons are displayed on the radar", 1916}) .category(std::make_pair("Game", 1824)) - .default_val(true) - .bind_to(&Radar_show_2d_icons) + .values({{RadarIconMode::Off, {"Off", 1286}}, + {RadarIconMode::On, {"On", 1285}}, + {RadarIconMode::TargetOnly, {"Target Only", 1917}}}) + .default_val(RadarIconMode::On) + .bind_to(&Radar_2d_icon_mode) .importance(56) .finish(); @@ -107,7 +110,7 @@ void radar_check_2d_icon_options() }); if (!has_icons) { - options::OptionsManager::instance()->removeOption(RadarShow2dIconsOption); + options::OptionsManager::instance()->removeOption(RadarIconModeOption); } } diff --git a/code/radar/radarsetup.h b/code/radar/radarsetup.h index fbe986f894c..84fc93e7cac 100644 --- a/code/radar/radarsetup.h +++ b/code/radar/radarsetup.h @@ -89,7 +89,12 @@ enum RadarVisibility DISTORTED //!< Visible but not fully }; -extern bool Radar_show_2d_icons; +enum class RadarIconMode { + Off = 0, + On = 1, + TargetOnly = 2 +}; +extern RadarIconMode Radar_2d_icon_mode; void radar_frame_init(); void radar_mission_init();