]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
strafehud: add audible feedback to strafehud (strafe sonar)
authorJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Sun, 15 Jan 2023 11:32:01 +0000 (12:32 +0100)
committerJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Tue, 4 Apr 2023 16:48:04 +0000 (18:48 +0200)
_hud_common.cfg
qcsrc/client/hud/panel/strafehud.qc
qcsrc/client/hud/panel/strafehud.qh

index 0028a732265d8f9dfec02bf3b604ed8a38a88a27..a854eec1e02f9d358b0265042d54574504d20a69 100644 (file)
@@ -209,6 +209,14 @@ seta hud_panel_strafehud_timeout_ground "0.1" "time (in seconds) after take off
 seta hud_panel_strafehud_timeout_turn "0.1" "time (in seconds) after releasing the strafe keys before changing mode (visually more consistent hud while switching between left/right strafe turning)"
 seta hud_panel_strafehud_antiflicker_angle "0.01" "how many degrees from 0° to 180° the hud ignores if it could cause visual disturbances otherwise (and to counter rounding errors)"
 seta hud_panel_strafehud_fps_update "0.5" "update interval (in seconds) of the frametime to calculate the optimal angle, smaller values may cause flickering"
+seta hud_panel_strafehud_sonar "0" "set to \"1\" to enable the strafe sonar"
+seta hud_panel_strafehud_sonar_audio "misc/talk" "audio to play for sonar"
+seta hud_panel_strafehud_sonar_start "0.5" "how optimal from 0 to 1 your strafing angle has to be for the strafe sonar to activate"
+seta hud_panel_strafehud_sonar_interval "0.333333" "strafe sonar sound interval in seconds"
+seta hud_panel_strafehud_sonar_volume_start "0.333333" "sound volume of the strafe sonar"
+seta hud_panel_strafehud_sonar_volume_range "0.666666" "dynamic volume range of the strafe sonar as you approach the optimal angle"
+seta hud_panel_strafehud_sonar_pitch_start "0.9" "playback speed of the strafe sonar"
+seta hud_panel_strafehud_sonar_pitch_range "0.1" "dynamic playback speed range of the strafe sonar as you approach the optimal angle"
 
 // hud panel aliases
 alias quickmenu "cl_cmd hud quickmenu ${* ?}"
index 075dfb3711bed22b957f3723c44e65ae06865f56..e0f6a0573977e2f5d7b0f0a620e89d249e981911 100644 (file)
@@ -872,6 +872,30 @@ void HUD_StrafeHUD()
                                DRAWFLAG_NORMAL);
                }
 
+               string newsound = autocvar_hud_panel_strafehud_sonar_audio;
+               static string cursound = string_null;
+               static string sonarsound = string_null;
+               if(newsound != cursound)
+               {
+                       if(cursound != "") strunzone(cursound);
+
+                       if(newsound != "") cursound = strzone(newsound);
+                       else cursound = string_null;
+
+                       if(sonarsound != "") strunzone(sonarsound);
+                       sonarsound = strzone(_Sound_fixpath(newsound));
+
+                       if(sonarsound != "")
+                       {
+                               precache_sound(sonarsound);
+                       }
+                       else
+                       {
+                               strunzone(sonarsound);
+                               sonarsound = string_null;
+                       }
+               }
+
                // draw the actual strafe angle
                if(!immobile)
                {
@@ -901,6 +925,33 @@ void HUD_StrafeHUD()
 
                        if(autocvar_hud_panel_strafehud_style == STRAFEHUD_STYLE_GRADIENT)
                                currentangle_color = StrafeHUD_mixColors(autocvar_hud_panel_strafehud_angle_neutral_color, currentangle_color, fabs(strafe_ratio));
+
+                       // reuse strafe ratio for strafe sonar
+                       static float sonar_time = 0;
+                       bool sonar_ready = ((time - sonar_time) >= autocvar_hud_panel_strafehud_sonar_interval) || (sonar_time == 0);
+                       if(autocvar_hud_panel_strafehud_sonar && sonar_ready)
+                       {
+                               float sonar_start = bound(0, autocvar_hud_panel_strafehud_sonar_start, 1);
+                               if(strafe_ratio >= sonar_start)
+                               {
+                                       sonar_time = time;
+
+                                       float sonar_ratio = strafe_ratio - sonar_start;
+                                       if(sonar_start != 1)
+                                               sonar_ratio /= 1 - sonar_start;
+                                       else
+                                               sonar_ratio = 1;
+
+                                       float sonar_volume = bound(0, autocvar_hud_panel_strafehud_sonar_volume_start, 1);
+                                       sonar_volume += autocvar_hud_panel_strafehud_sonar_volume_range * sonar_ratio;
+
+                                       float sonar_pitch = max(0, autocvar_hud_panel_strafehud_sonar_pitch_start);
+                                       sonar_pitch += autocvar_hud_panel_strafehud_sonar_pitch_range * sonar_ratio;
+
+                                       if(sonar_volume > 0)
+                                               sound7(csqcplayer, CH_INFO, sonarsound, bound(0, sonar_volume, 1) * VOL_BASE, ATTN_NONE, max(0.000001, sonar_pitch * 100), 0);
+                               }
+                       }
                }
 
                if(mode == STRAFEHUD_MODE_VIEW_CENTERED || straight_overturn)
index 4f59ce3c4a2997447800dbbe80a34cbd14dad003..81836ae19fa0ebbbe3b88904933f37f457416eac 100644 (file)
@@ -58,6 +58,14 @@ float autocvar_hud_panel_strafehud_timeout_ground = 0.1;
 float autocvar_hud_panel_strafehud_timeout_turn = 0.1;
 float autocvar_hud_panel_strafehud_antiflicker_angle = 0.01;
 float autocvar_hud_panel_strafehud_fps_update = 0.5;
+bool autocvar_hud_panel_strafehud_sonar = false;
+string autocvar_hud_panel_strafehud_sonar_audio = "misc/talk";
+float autocvar_hud_panel_strafehud_sonar_start = 0.5;
+float autocvar_hud_panel_strafehud_sonar_interval = 0.333333;
+float autocvar_hud_panel_strafehud_sonar_volume_start = 0.333333;
+float autocvar_hud_panel_strafehud_sonar_volume_range = 0.666666;
+float autocvar_hud_panel_strafehud_sonar_pitch_start = 0.9;
+float autocvar_hud_panel_strafehud_sonar_pitch_range = 0.1;
 
 void HUD_Panel_DrawStrafeHUD(float, float, float, vector, float, int, int);
 vector StrafeHUD_mixColors(vector, vector, float);