From 6a26ca50618fb6ac3cad00016ead882565f5253e Mon Sep 17 00:00:00 2001 From: Goober5000 Date: Tue, 6 Feb 2024 11:27:11 -0500 Subject: [PATCH 1/3] only display these warnings once, and only on explicit save --- fred2/missionsave.cpp | 16 +++++++++++++--- qtfred/src/mission/missionsave.cpp | 22 ++++++++++++++++------ 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/fred2/missionsave.cpp b/fred2/missionsave.cpp index 4e860fa6da8..dc6a641cdf3 100644 --- a/fred2/missionsave.cpp +++ b/fred2/missionsave.cpp @@ -977,9 +977,7 @@ int CFred_mission_save::save_bitmaps() } // save our flags - if (Mission_save_format == FSO_FORMAT_RETAIL) { - MessageBox(nullptr, "Warning: Background flags (including the fixed-angles-in-mission-file flag) are not supported in retail. The sun and bitmap angles will be loaded differently by previous versions.", "Incompatibility with retail mission format", MB_OK); - } else if (background->flags.any_set()) { + if (Mission_save_format != FSO_FORMAT_RETAIL && background->flags.any_set()) { if (optional_string_fred("+Flags:")) { parse_comments(); } else { @@ -2609,6 +2607,18 @@ int CFred_mission_save::save_mission_file(const char *pathname) } strcat_s(savepath, "saving.xxx"); + // only display this warning once, and only when the user explicitly saves, as opposed to autosave + static bool Displayed_retail_background_warning = false; + if (Mission_save_format != FSO_FORMAT_STANDARD && !Displayed_retail_background_warning) { + for (const auto &bg : Backgrounds) { + if (bg.flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) { + MessageBox(nullptr, "Warning: Background flags (including the fixed-angles-in-mission-file flag) are not supported in retail. The sun and bitmap angles will be loaded differently by previous versions.", "Incompatibility with retail mission format", MB_OK); + Displayed_retail_background_warning = true; + break; + } + } + } + save_mission_internal(savepath); if (!err) { diff --git a/qtfred/src/mission/missionsave.cpp b/qtfred/src/mission/missionsave.cpp index 173dbfb7acc..1780af7fe38 100644 --- a/qtfred/src/mission/missionsave.cpp +++ b/qtfred/src/mission/missionsave.cpp @@ -992,12 +992,7 @@ int CFred_mission_save::save_bitmaps() } // save our flags - if (save_format == MissionFormat::RETAIL) { - _viewport->dialogProvider->showButtonDialog(DialogType::Warning, - "Incompatibility with retail mission format", - "Warning: Background flags (including the fixed-angles-in-mission-file flag) are not supported in retail. The sun and bitmap angles will be loaded differently by previous versions.", - { DialogButton::Ok }); - } else if (background->flags.any_set()) { + if (save_format != MissionFormat::RETAIL && background->flags.any_set()) { if (optional_string_fred("+Flags:")) { parse_comments(); } else { @@ -2508,6 +2503,21 @@ int CFred_mission_save::save_mission_file(const char* pathname_in) } strcat_s(savepath, "saving.xxx"); + // only display this warning once, and only when the user explicitly saves, as opposed to autosave + static bool Displayed_retail_background_warning = false; + if (save_format != MissionFormat::STANDARD && !Displayed_retail_background_warning) { + for (const auto &bg : Backgrounds) { + if (bg.flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) { + _viewport->dialogProvider->showButtonDialog(DialogType::Warning, + "Incompatibility with retail mission format", + "Warning: Background flags (including the fixed-angles-in-mission-file flag) are not supported in retail. The sun and bitmap angles will be loaded differently by previous versions.", + { DialogButton::Ok }); + Displayed_retail_background_warning = true; + break; + } + } + } + save_mission_internal(savepath); if (!err) { From b74824f7938533f8322e8b70a6ed2711e02ea8a2 Mon Sep 17 00:00:00 2001 From: Goober5000 Date: Tue, 6 Feb 2024 23:58:47 -0500 Subject: [PATCH 2/3] use a different method for removing blank backgrounds --- code/starfield/starfield.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/code/starfield/starfield.cpp b/code/starfield/starfield.cpp index 1c4c0d7e8ce..bcc9c6aa628 100644 --- a/code/starfield/starfield.cpp +++ b/code/starfield/starfield.cpp @@ -3011,14 +3011,20 @@ bool stars_background_empty(const background_t &bg) // Goober5000 void stars_pack_backgrounds() { - // remove all empty backgrounds - Backgrounds.erase( - std::remove_if(Backgrounds.begin(), Backgrounds.end(), stars_background_empty), - Backgrounds.end()); + size_t remove_count = 0; + // remove all empty backgrounds, with a caveat: // in FRED, make sure we always have at least one background - if (Fred_running && Backgrounds.empty()) - stars_add_blank_background(true); + // (note: older code removed all blank backgrounds and re-added one if necessary; but that method caused flag changes to be lost) + Backgrounds.erase( + std::remove_if(Backgrounds.begin(), Backgrounds.end(), [&](const background_t& bg) { + if (stars_background_empty(bg)) { + if (Fred_running && ++remove_count == Backgrounds.size()) + return false; // cancel the last removal if FRED is running and if the last removal would result in all backgrounds being removed (i.e. all were blank) + return true; + } + return false; + }), Backgrounds.end()); } static void render_environment(int i, vec3d *eye_pos, matrix *new_orient, fov_t new_zoom) From 8a3b36d92172982163cccd2cf25a473c674cd70a Mon Sep 17 00:00:00 2001 From: Goober5000 Date: Wed, 7 Feb 2024 21:43:11 -0500 Subject: [PATCH 3/3] uncorrect angles if we're saving without the corrected angles flag (which will happen if the save format isn't STANDARD) --- fred2/missionsave.cpp | 7 +++---- qtfred/src/mission/missionsave.cpp | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/fred2/missionsave.cpp b/fred2/missionsave.cpp index dc6a641cdf3..d3f915df914 100644 --- a/fred2/missionsave.cpp +++ b/fred2/missionsave.cpp @@ -977,7 +977,7 @@ int CFred_mission_save::save_bitmaps() } // save our flags - if (Mission_save_format != FSO_FORMAT_RETAIL && background->flags.any_set()) { + if (Mission_save_format == FSO_FORMAT_STANDARD && background->flags.any_set()) { if (optional_string_fred("+Flags:")) { parse_comments(); } else { @@ -994,7 +994,6 @@ int CFred_mission_save::save_bitmaps() for (j = 0; j < background->suns.size(); j++) { starfield_list_entry *sle = &background->suns[j]; - // filename required_string_fred("$Sun:"); parse_comments(); @@ -1004,7 +1003,7 @@ int CFred_mission_save::save_bitmaps() required_string_fred("+Angles:"); parse_comments(); angles ang = sle->ang; - if (!background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) + if (Mission_save_format != FSO_FORMAT_STANDARD || !background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) stars_uncorrect_background_sun_angles(&ang); fout(" %f %f %f", ang.p, ang.b, ang.h); @@ -1027,7 +1026,7 @@ int CFred_mission_save::save_bitmaps() required_string_fred("+Angles:"); parse_comments(); angles ang = sle->ang; - if (!background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) + if (Mission_save_format != FSO_FORMAT_STANDARD || !background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) stars_uncorrect_background_bitmap_angles(&ang); fout(" %f %f %f", ang.p, ang.b, ang.h); diff --git a/qtfred/src/mission/missionsave.cpp b/qtfred/src/mission/missionsave.cpp index 1780af7fe38..01554632c6d 100644 --- a/qtfred/src/mission/missionsave.cpp +++ b/qtfred/src/mission/missionsave.cpp @@ -992,7 +992,7 @@ int CFred_mission_save::save_bitmaps() } // save our flags - if (save_format != MissionFormat::RETAIL && background->flags.any_set()) { + if (save_format == MissionFormat::STANDARD && background->flags.any_set()) { if (optional_string_fred("+Flags:")) { parse_comments(); } else { @@ -1018,7 +1018,7 @@ int CFred_mission_save::save_bitmaps() required_string_fred("+Angles:"); parse_comments(); angles ang = sle->ang; - if (!background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) + if (save_format != MissionFormat::STANDARD || !background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) stars_uncorrect_background_sun_angles(&ang); fout(" %f %f %f", ang.p, ang.b, ang.h); @@ -1041,7 +1041,7 @@ int CFred_mission_save::save_bitmaps() required_string_fred("+Angles:"); parse_comments(); angles ang = sle->ang; - if (!background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) + if (save_format != MissionFormat::STANDARD || !background->flags[Starfield::Background_Flags::Corrected_angles_in_mission_file]) stars_uncorrect_background_bitmap_angles(&ang); fout(" %f %f %f", ang.p, ang.b, ang.h);