Skip to content

Commit 993a9e9

Browse files
Merge pull request #4463 from Kiloku/bugfix/3321-clamp-values-from-pilot-file
Clamp values to their correct ranges when loading and saving pilot and campaign files
2 parents c0ea9f5 + 516548d commit 993a9e9

File tree

3 files changed

+95
-6
lines changed

3 files changed

+95
-6
lines changed

code/pilotfile/csg.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,11 +1134,20 @@ void pilotfile::csg_write_variables()
11341134

11351135
void pilotfile::csg_read_settings()
11361136
{
1137+
clamped_range_warnings.clear();
11371138
// sound/voice/music
11381139
if (!Using_in_game_options) {
1139-
snd_set_effects_volume(cfread_float(cfp));
1140-
event_music_set_volume(cfread_float(cfp));
1141-
snd_set_voice_volume(cfread_float(cfp));
1140+
float temp_volume = cfread_float(cfp);
1141+
clamp_value_with_warn(&temp_volume, 0.f, 1.f, "Effects Volume");
1142+
snd_set_effects_volume(temp_volume);
1143+
1144+
temp_volume = cfread_float(cfp);
1145+
clamp_value_with_warn(&temp_volume, 0.f, 1.f, "Music Volume");
1146+
event_music_set_volume(temp_volume);
1147+
1148+
temp_volume = cfread_float(cfp);
1149+
clamp_value_with_warn(&temp_volume, 0.f, 1.f, "Voice Volume");
1150+
snd_set_voice_volume(temp_volume);
11421151

11431152
Briefing_voice_enabled = cfread_int(cfp) != 0;
11441153
} else {
@@ -1154,13 +1163,20 @@ void pilotfile::csg_read_settings()
11541163

11551164
// skill level
11561165
Game_skill_level = cfread_int(cfp);
1166+
clamp_value_with_warn(&Game_skill_level, 0, 4, "Game Skill Level");
11571167

11581168
// input options
11591169
if (!Using_in_game_options) {
11601170
Use_mouse_to_fly = cfread_int(cfp) != 0;
11611171
Mouse_sensitivity = cfread_int(cfp);
1172+
clamp_value_with_warn(&Mouse_sensitivity, 0, 9, "Mouse Sensitivity");
1173+
11621174
Joy_sensitivity = cfread_int(cfp);
1175+
clamp_value_with_warn(&Joy_sensitivity, 0, 9, "Joystick Sensitivity");
1176+
11631177
Joy_dead_zone_size = cfread_int(cfp);
1178+
clamp_value_with_warn(&Joy_dead_zone_size, 0, 45, "Joystick Deadzone");
1179+
11641180
} else {
11651181
// The values are set by the in-game menu but we still need to read the int from the file to maintain the correct offset
11661182
cfread_int(cfp);
@@ -1184,28 +1200,44 @@ void pilotfile::csg_read_settings()
11841200
dummy = cfread_int(cfp);
11851201
dummy = cfread_int(cfp);
11861202
}
1203+
if (!clamped_range_warnings.empty()) {
1204+
ReleaseWarning(LOCATION, "The following values in the campaign save file were out of bounds and were automatically reset:\n%s\nPlease check your settings!\n", clamped_range_warnings.c_str());
1205+
clamped_range_warnings.clear();
1206+
}
11871207
}
11881208

11891209
void pilotfile::csg_write_settings()
11901210
{
11911211
startSection(Section::Settings);
1212+
clamped_range_warnings.clear();
11921213

11931214
// sound/voice/music
1215+
clamp_value_with_warn(&Master_sound_volume, 0.f, 1.f, "Effects Volume");
11941216
cfwrite_float(Master_sound_volume, cfp);
1217+
clamp_value_with_warn(&Master_event_music_volume, 0.f, 1.f, "Music Volume");
11951218
cfwrite_float(Master_event_music_volume, cfp);
1219+
clamp_value_with_warn(&Master_voice_volume, 0.f, 1.f, "Voice Volume");
11961220
cfwrite_float(Master_voice_volume, cfp);
11971221

11981222
cfwrite_int(Briefing_voice_enabled ? 1 : 0, cfp);
11991223

12001224
// skill level
1225+
clamp_value_with_warn(&Game_skill_level, 0, 4, "Game Skill Level");
12011226
cfwrite_int(Game_skill_level, cfp);
12021227

12031228
// input options
12041229
cfwrite_int(Use_mouse_to_fly, cfp);
1230+
clamp_value_with_warn(&Mouse_sensitivity, 0, 9, "Mouse Sensitivity");
12051231
cfwrite_int(Mouse_sensitivity, cfp);
1232+
clamp_value_with_warn(&Joy_sensitivity, 0, 9, "Joystick Sensitivity");
12061233
cfwrite_int(Joy_sensitivity, cfp);
1234+
clamp_value_with_warn(&Joy_dead_zone_size, 0, 45, "Joystick Deadzone");
12071235
cfwrite_int(Joy_dead_zone_size, cfp);
12081236

1237+
if (!clamped_range_warnings.empty()) {
1238+
ReleaseWarning(LOCATION, "The following values were out of bounds when saving the campaign file and were automatically reset.\n%s\nThis shouldn't be possible, please contact the FreeSpace 2 Open Source Code Project!\n", clamped_range_warnings.c_str());
1239+
clamped_range_warnings.clear();
1240+
}
12091241
endSection();
12101242
}
12111243

code/pilotfile/pilotfile.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,17 @@ class pilotfile {
157157
// file offset of the size value for the current section (set with startSection())
158158
size_t m_size_offset;
159159

160+
SCP_string clamped_range_warnings = "";
161+
162+
template <typename T> void clamp_value_with_warn(T* value, T min, T max, const char* name) {
163+
if (*value < min) {
164+
clamped_range_warnings += SCP_string(name) + ": too low (" + std::to_string(*value) + "). Will reset to minimum (" + std::to_string(min) + ")\n";
165+
*value = min;
166+
} else if (*value > max) {
167+
clamped_range_warnings += SCP_string(name) + ": too high (" + std::to_string(*value) + "). Will reset to maximum (" + std::to_string(max) + ")\n";
168+
*value = max;
169+
}
170+
}
160171

161172
// --------------------------------------------------------------------
162173
// PLR specific

code/pilotfile/plr.cpp

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -795,11 +795,20 @@ void pilotfile::plr_write_controls()
795795

796796
void pilotfile::plr_read_settings()
797797
{
798+
clamped_range_warnings.clear();
798799
// sound/voice/music
799800
if (!Using_in_game_options) {
800-
snd_set_effects_volume(handler->readFloat("master_sound_volume"));
801-
event_music_set_volume(handler->readFloat("master_event_music_volume"));
802-
snd_set_voice_volume(handler->readFloat("aster_voice_volume"));
801+
float temp_volume = handler->readFloat("master_sound_volume");
802+
clamp_value_with_warn(&temp_volume, 0.f, 1.f, "Effects Volume");
803+
snd_set_effects_volume(temp_volume);
804+
805+
temp_volume = handler->readFloat("master_event_music_volume");
806+
clamp_value_with_warn(&temp_volume, 0.f, 1.f, "Music Volume");
807+
event_music_set_volume(temp_volume);
808+
809+
temp_volume = handler->readFloat("aster_voice_volume");
810+
clamp_value_with_warn(&temp_volume, 0.f, 1.f, "Voice Volume");
811+
snd_set_voice_volume(temp_volume);
803812

804813
Briefing_voice_enabled = handler->readInt("briefing_voice_enabled") != 0;
805814
} else {
@@ -814,24 +823,37 @@ void pilotfile::plr_read_settings()
814823

815824
// skill level
816825
Game_skill_level = handler->readInt("game_skill_level");
826+
clamp_value_with_warn(&Game_skill_level, 0, 4, "Skill Level");
817827

818828
// input options
819829
if (!Using_in_game_options) {
820830
Use_mouse_to_fly = handler->readInt("use_mouse_to_fly") != 0;
821831
Mouse_sensitivity = handler->readInt("mouse_sensitivity");
832+
clamp_value_with_warn(&Mouse_sensitivity, 0, 9, "Mouse Sensitivity");
822833
Joy_sensitivity = handler->readInt("joy_sensitivity");
834+
clamp_value_with_warn(&Joy_sensitivity, 0, 9, "Joystick Sensitivity");
823835
Joy_dead_zone_size = handler->readInt("joy_dead_zone_size");
836+
clamp_value_with_warn(&Joy_dead_zone_size, 0, 45, "Joystick Deadzone");
824837

825838
// detail
826839
Detail.setting = handler->readInt("setting");
840+
clamp_value_with_warn(&Detail.setting, -1, NUM_DEFAULT_DETAIL_LEVELS - 1, "Detail Level Preset");
827841
Detail.nebula_detail = handler->readInt("nebula_detail");
842+
clamp_value_with_warn(&Detail.nebula_detail, 0, MAX_DETAIL_LEVEL, "Nebula Detail");
828843
Detail.detail_distance = handler->readInt("detail_distance");
844+
clamp_value_with_warn(&Detail.detail_distance, 0, MAX_DETAIL_LEVEL, "Model Detail");
829845
Detail.hardware_textures = handler->readInt("hardware_textures");
846+
clamp_value_with_warn(&Detail.hardware_textures, 0, MAX_DETAIL_LEVEL, "3D Hardware Textures");
830847
Detail.num_small_debris = handler->readInt("num_small_debris");
848+
clamp_value_with_warn(&Detail.num_small_debris, 0, MAX_DETAIL_LEVEL, "Impact Effects");
831849
Detail.num_particles = handler->readInt("num_particles");
850+
clamp_value_with_warn(&Detail.num_particles, 0, MAX_DETAIL_LEVEL, "Particles");
832851
Detail.num_stars = handler->readInt("num_stars");
852+
clamp_value_with_warn(&Detail.num_stars, 0, MAX_DETAIL_LEVEL, "Stars");
833853
Detail.shield_effects = handler->readInt("shield_effects");
854+
clamp_value_with_warn(&Detail.shield_effects, 0, MAX_DETAIL_LEVEL, "Shield Hit Effects");
834855
Detail.lighting = handler->readInt("lighting");
856+
clamp_value_with_warn(&Detail.lighting, 0, MAX_DETAIL_LEVEL, "Lighting");
835857
Detail.targetview_model = handler->readInt("targetview_model");
836858
Detail.planets_suns = handler->readInt("planets_suns");
837859
Detail.weapon_extras = handler->readInt("weapon_extras");
@@ -856,42 +878,66 @@ void pilotfile::plr_read_settings()
856878
handler->readInt("planets_suns");
857879
handler->readInt("weapon_extras");
858880
}
881+
if (!clamped_range_warnings.empty()) {
882+
ReleaseWarning(LOCATION, "The following values in the pilot file were out of bounds and were automatically reset:\n%s\nPlease check your settings!\n", clamped_range_warnings.c_str());
883+
clamped_range_warnings.clear();
884+
}
859885
}
860886

861887
void pilotfile::plr_write_settings()
862888
{
863889
handler->startSectionWrite(Section::Settings);
864890

865891
// sound/voice/music
892+
clamp_value_with_warn(&Master_sound_volume, 0.f, 1.f, "Effects Volume");
866893
handler->writeFloat("master_sound_volume", Master_sound_volume);
894+
clamp_value_with_warn(&Master_event_music_volume, 0.f, 1.f, "Music Volume");
867895
handler->writeFloat("master_event_music_volume", Master_event_music_volume);
896+
clamp_value_with_warn(&Master_voice_volume, 0.f, 1.f, "Voice Volume");
868897
handler->writeFloat("aster_voice_volume", Master_voice_volume);
869898

870899
handler->writeInt("briefing_voice_enabled", Briefing_voice_enabled ? 1 : 0);
871900

872901
// skill level
902+
clamp_value_with_warn(&Game_skill_level, 0, 4, "Skill Level");
873903
handler->writeInt("game_skill_level", Game_skill_level);
874904

875905
// input options
876906
handler->writeInt("use_mouse_to_fly", Use_mouse_to_fly);
907+
clamp_value_with_warn(&Mouse_sensitivity, 0, 9, "Mouse Sensitivity");
877908
handler->writeInt("mouse_sensitivity", Mouse_sensitivity);
909+
clamp_value_with_warn(&Joy_sensitivity, 0, 9, "Joystick Sensitivity");
878910
handler->writeInt("joy_sensitivity", Joy_sensitivity);
911+
clamp_value_with_warn(&Joy_dead_zone_size, 0, 45, "Joystick Deadzone");
879912
handler->writeInt("joy_dead_zone_size", Joy_dead_zone_size);
880913

881914
// detail
915+
clamp_value_with_warn(&Detail.setting, -1, NUM_DEFAULT_DETAIL_LEVELS - 1, "Detail Level Preset");
882916
handler->writeInt("setting", Detail.setting);
917+
clamp_value_with_warn(&Detail.nebula_detail, 0, MAX_DETAIL_LEVEL, "Nebula Detail");
883918
handler->writeInt("nebula_detail", Detail.nebula_detail);
919+
clamp_value_with_warn(&Detail.detail_distance, 0, MAX_DETAIL_LEVEL, "Model Detail");
884920
handler->writeInt("detail_distance", Detail.detail_distance);
921+
clamp_value_with_warn(&Detail.hardware_textures, 0, MAX_DETAIL_LEVEL, "3D Hardware Textures");
885922
handler->writeInt("hardware_textures", Detail.hardware_textures);
923+
clamp_value_with_warn(&Detail.num_small_debris, 0, MAX_DETAIL_LEVEL, "Impact Effects");
886924
handler->writeInt("num_small_debris", Detail.num_small_debris);
925+
clamp_value_with_warn(&Detail.num_particles, 0, MAX_DETAIL_LEVEL, "Particles");
887926
handler->writeInt("num_particles", Detail.num_particles);
927+
clamp_value_with_warn(&Detail.num_stars, 0, MAX_DETAIL_LEVEL, "Stars");
888928
handler->writeInt("num_stars", Detail.num_stars);
929+
clamp_value_with_warn(&Detail.shield_effects, 0, MAX_DETAIL_LEVEL, "Shield Hit Effects");
889930
handler->writeInt("shield_effects", Detail.shield_effects);
931+
clamp_value_with_warn(&Detail.lighting, 0, MAX_DETAIL_LEVEL, "Lighting");
890932
handler->writeInt("lighting", Detail.lighting);
891933
handler->writeInt("targetview_model", Detail.targetview_model);
892934
handler->writeInt("planets_suns", Detail.planets_suns);
893935
handler->writeInt("weapon_extras", Detail.weapon_extras);
894936

937+
if (!clamped_range_warnings.empty()) {
938+
ReleaseWarning(LOCATION, "The following values were out of bounds when saving the Pilot file and were automatically reset.\n%s\nThis shouldn't be possible, please contact the FreeSpace 2 Open Source Code Project!\n", clamped_range_warnings.c_str());
939+
clamped_range_warnings.clear();
940+
}
895941
handler->endSectionWrite();
896942
}
897943

0 commit comments

Comments
 (0)