mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-07 08:15:59 -10:00
* always use exact match * custom gauges should use the type for colors with old preset files
166 lines
4.8 KiB
C++
166 lines
4.8 KiB
C++
#include "plr_hudprefs.h"
|
|
|
|
#include "globalincs/pstypes.h"
|
|
|
|
#include "cfile/cfile.h"
|
|
#include "hud/hudconfig.h"
|
|
#include <parse/parselo.h>
|
|
|
|
// Saves the player's current HUD preferences (visibility, popup, color for all gauges)
|
|
// to a specific file (<callsign>.hdp) in the player directory.
|
|
void hud_config_save_player_prefs(const char* callsign)
|
|
{
|
|
if (callsign == nullptr || *callsign == '\0') {
|
|
mprintf(("HUDPREFS: Cannot save preferences - invalid callsign provided.\n"));
|
|
return;
|
|
}
|
|
|
|
SCP_string filename = callsign;
|
|
filename += ".hdp";
|
|
|
|
CFILE* file = cfopen(filename.c_str(), "wt", CF_TYPE_DATA);
|
|
|
|
if (file == nullptr) {
|
|
mprintf(("HUDPREFS: Unable to open file '%s' for writing player HUD preferences.\n", filename.c_str()));
|
|
return;
|
|
}
|
|
|
|
mprintf(("HUDPREFS: Saving player HUD preferences to '%s'...\n", filename.c_str()));
|
|
|
|
char format_buffer[256];
|
|
|
|
cfputs("+Version: 1\n\n", file);
|
|
|
|
// Iterate ALL gauges
|
|
for (const auto& pair : HUD_config.gauge_colors) {
|
|
const SCP_string& gauge_id = pair.first;
|
|
|
|
if (gauge_id.empty()) {
|
|
continue;
|
|
}
|
|
|
|
// Get current state
|
|
bool is_visible = HUD_config.is_gauge_visible(gauge_id);
|
|
bool is_popup = HUD_config.is_gauge_popup(gauge_id);
|
|
|
|
// Get color to save. If gauge is hidden in configure screen, then player cannot set it,
|
|
// so look up the parent gauge type and save/set it. --wookeejedi
|
|
color clr;
|
|
if (HUD_config.is_gauge_shown_in_config(gauge_id)) {
|
|
clr = pair.second;
|
|
} else {
|
|
clr = HUD_config.get_gauge_color(gauge_id);
|
|
HUD_config.set_gauge_color(gauge_id, clr);
|
|
}
|
|
|
|
// +Gauge: <id>
|
|
sprintf(format_buffer, "+Gauge: %s\n", gauge_id.c_str());
|
|
cfputs(format_buffer, file);
|
|
|
|
// +Visible: <0_or_1>
|
|
sprintf(format_buffer, "+Visible: %d\n", is_visible ? 1 : 0);
|
|
cfputs(format_buffer, file);
|
|
|
|
// +Popup: <0_or_1>
|
|
sprintf(format_buffer, "+Popup: %d\n", is_popup ? 1 : 0);
|
|
cfputs(format_buffer, file);
|
|
|
|
// +Color: <r> <g> <b> <a>
|
|
sprintf(format_buffer, "+Color: %d %d %d %d\n\n", clr.red, clr.green, clr.blue, clr.alpha);
|
|
cfputs(format_buffer, file);
|
|
}
|
|
|
|
cfclose(file);
|
|
|
|
mprintf(("HUDPREFS: Finished saving player HUD preferences.\n"));
|
|
}
|
|
|
|
// Loads the player's HUD preferences (visibility, popup, color for all gauges)
|
|
// from the specific file (<callsign>.hdp) in the player directory, if it exists.
|
|
void hud_config_load_player_prefs(const char* callsign)
|
|
{
|
|
if (callsign == nullptr || *callsign == '\0') {
|
|
mprintf(("HUDPREFS: Cannot load preferences - invalid callsign provided.\n"));
|
|
return;
|
|
}
|
|
|
|
// Construct the filename: <callsign>.hdp
|
|
SCP_string filename = callsign;
|
|
filename += ".hdp";
|
|
|
|
// Check if the file exists in the player directories
|
|
int file_location = cf_exists(filename.c_str(), CF_TYPE_DATA);
|
|
|
|
if (file_location == -1) {
|
|
// File doesn't exist, which is fine - means no custom prefs saved yet.
|
|
mprintf(("HUDPREFS: No player HUD preferences file found ('%s'). Using defaults/player file settings.\n", filename.c_str()));
|
|
return;
|
|
}
|
|
|
|
mprintf(("HUDPREFS: Loading player HUD preferences from '%s'...\n", filename.c_str()));
|
|
|
|
try {
|
|
|
|
read_file_text(filename.c_str());
|
|
reset_parse();
|
|
|
|
if (optional_string("+Version:")) {
|
|
int version = 1;
|
|
stuff_int(&version);
|
|
// Can add version checks here later if format changes
|
|
if (version != 1) {
|
|
mprintf(("HUDPREFS: Warning - Unknown version %d in '%s'. Trying to parse anyway.\n",
|
|
version,
|
|
filename.c_str()));
|
|
}
|
|
}
|
|
|
|
// Loop through all gauge blocks in the file
|
|
while (optional_string("+Gauge:")) {
|
|
SCP_string gauge_id;
|
|
int visible_int = 0;
|
|
int popup_int = 0;
|
|
ubyte r = 0, g = 0, b = 0, a = 255; // Default alpha to opaque
|
|
|
|
// Parse gauge ID
|
|
stuff_string(gauge_id, F_NAME);
|
|
|
|
// Parse visibility
|
|
required_string("+Visible:");
|
|
stuff_int(&visible_int);
|
|
bool is_visible = (visible_int != 0);
|
|
|
|
// Parse popup
|
|
required_string("+Popup:");
|
|
stuff_int(&popup_int);
|
|
bool is_popup = (popup_int != 0);
|
|
|
|
// Parse color
|
|
required_string("+Color:");
|
|
stuff_ubyte(&r);
|
|
stuff_ubyte(&g);
|
|
stuff_ubyte(&b);
|
|
stuff_ubyte(&a);
|
|
|
|
// Validate gauge ID before applying settings
|
|
if (!gauge_id.empty()) {
|
|
color clr;
|
|
gr_init_alphacolor(&clr, r, g, b, a);
|
|
|
|
HUD_config.set_gauge_visibility(gauge_id, is_visible);
|
|
HUD_config.set_gauge_popup(gauge_id, is_popup);
|
|
HUD_config.set_gauge_color(gauge_id, clr);
|
|
} else {
|
|
mprintf(("HUDPREFS: Warning - Encountered empty gauge ID while parsing '%s'. Skipping entry.\n",filename.c_str()));
|
|
}
|
|
}
|
|
|
|
mprintf(("HUDPREFS: Finished loading player HUD preferences.\n"));
|
|
|
|
} catch (const parse::ParseException& e) {
|
|
mprintf(("HUDPREFS: Error parsing player HUD preferences file '%s'! Error: %s\n", filename.c_str(), e.what()));
|
|
} catch (...) {
|
|
mprintf(("HUDPREFS: Unknown error parsing player HUD preferences file '%s'!\n", filename.c_str()));
|
|
}
|
|
}
|