@@ -795,11 +795,20 @@ void pilotfile::plr_write_controls()
795795
796796void 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\n Please check your settings!\n " , clamped_range_warnings.c_str ());
883+ clamped_range_warnings.clear ();
884+ }
859885}
860886
861887void 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\n This 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