shithub: choc

Download patch

ref: 41a22dcb13d8f831143a97b901388865c89b1dc2
parent: 62c8b62c5efa78dadf25a3ffdcdfe84601ef33d0
author: Jonathan Dowland <jon@dow.land>
date: Tue Oct 10 14:14:51 EDT 2017

Permit binding of joystick axes to look up/down

In games which support a look/down action (Heretic, Hexen, Strife)
permit binding a joystick axis to those actions.

Altazimuth was asking me some questions on IRC about how we handle
mouse wheel actions and that got me thinking about some of the
input stuff (specifically joystick stuff) that we hadn't finished
off.

--- a/src/d_event.h
+++ b/src/d_event.h
@@ -72,7 +72,7 @@
     evtype_t type;
 
     // Event-specific data; see the descriptions given above.
-    int data1, data2, data3, data4;
+    int data1, data2, data3, data4, data5;
 } event_t;
 
  
--- a/src/heretic/g_game.c
+++ b/src/heretic/g_game.c
@@ -193,6 +193,7 @@
 
 int joyxmove, joyymove;         // joystick values are repeated
 int joystrafemove;
+int joylook;
 boolean joyarray[MAX_JOY_BUTTONS + 1];
 boolean *joybuttons = &joyarray[1];     // allow [-1]
 
@@ -386,11 +387,11 @@
         side -= sidemove[speed];
 
     // Look up/down/center keys
-    if (gamekeydown[key_lookup])
+    if (gamekeydown[key_lookup] || joylook < 0)
     {
         look = lspeed;
     }
-    if (gamekeydown[key_lookdown])
+    if (gamekeydown[key_lookdown] || joylook > 0)
     {
         look = -lspeed;
     }
@@ -689,7 +690,7 @@
 //
 
     memset(gamekeydown, 0, sizeof(gamekeydown));
-    joyxmove = joyymove = joystrafemove = 0;
+    joyxmove = joyymove = joystrafemove = joylook = 0;
     mousex = mousey = 0;
     sendpause = sendsave = paused = false;
     memset(mousearray, 0, sizeof(mousearray));
@@ -906,6 +907,7 @@
             joyxmove = ev->data2;
             joyymove = ev->data3;
             joystrafemove = ev->data4;
+            joylook = ev->data5;
             return (true);      // eat events
 
         default:
--- a/src/hexen/g_game.c
+++ b/src/hexen/g_game.c
@@ -160,6 +160,7 @@
 
 int joyxmove, joyymove;         // joystick values are repeated
 int joystrafemove;
+int joylook;
 boolean joyarray[MAX_JOY_BUTTONS + 1];
 boolean *joybuttons = &joyarray[1];     // allow [-1]
 
@@ -325,11 +326,11 @@
     }
 
     // Look up/down/center keys
-    if (gamekeydown[key_lookup])
+    if (gamekeydown[key_lookup] || joylook < 0)
     {
         look = lspeed;
     }
-    if (gamekeydown[key_lookdown])
+    if (gamekeydown[key_lookdown] || joylook > 0)
     {
         look = -lspeed;
     }
@@ -700,7 +701,7 @@
 // 
 
     memset(gamekeydown, 0, sizeof(gamekeydown));
-    joyxmove = joyymove = joystrafemove = 0;
+    joyxmove = joyymove = joystrafemove = joylook = 0;
     mousex = mousey = 0;
     sendpause = sendsave = paused = false;
     memset(mousearray, 0, sizeof(mousearray));
@@ -918,6 +919,7 @@
             joyxmove = ev->data2;
             joyymove = ev->data3;
             joystrafemove = ev->data4;
+            joylook = ev->data5;
             return (true);      // eat events
 
         default:
--- a/src/i_joystick.c
+++ b/src/i_joystick.c
@@ -65,6 +65,11 @@
 static int joystick_strafe_axis = -1;
 static int joystick_strafe_invert = 0;
 
+// Which joystick axis to use for looking?
+
+static int joystick_look_axis = -1;
+static int joystick_look_invert = 0;
+
 // Virtual to physical button joystick button mapping. By default this
 // is a straight mapping.
 static int joystick_physical_buttons[NUM_VIRTUAL_BUTTONS] = {
@@ -177,7 +182,8 @@
 
     if (!IsValidAxis(joystick_x_axis)
      || !IsValidAxis(joystick_y_axis)
-     || !IsValidAxis(joystick_strafe_axis))
+     || !IsValidAxis(joystick_strafe_axis)
+     || !IsValidAxis(joystick_look_axis))
     {
         printf("I_InitJoystick: Invalid joystick axis for configured joystick "
                "(run joystick setup again)\n");
@@ -222,6 +228,14 @@
             return true;
         }
     }
+    if (IS_BUTTON_AXIS(joystick_look_axis))
+    {
+        if (physbutton == BUTTON_AXIS_NEG(joystick_look_axis)
+         || physbutton == BUTTON_AXIS_POS(joystick_look_axis))
+        {
+            return true;
+        }
+    }
 
     return false;
 }
@@ -357,6 +371,7 @@
         ev.data2 = GetAxisState(joystick_x_axis, joystick_x_invert);
         ev.data3 = GetAxisState(joystick_y_axis, joystick_y_invert);
         ev.data4 = GetAxisState(joystick_strafe_axis, joystick_strafe_invert);
+        ev.data5 = GetAxisState(joystick_look_axis, joystick_look_invert);
 
         D_PostEvent(&ev);
     }
@@ -375,6 +390,8 @@
     M_BindIntVariable("joystick_x_invert",     &joystick_x_invert);
     M_BindIntVariable("joystick_y_invert",     &joystick_y_invert);
     M_BindIntVariable("joystick_strafe_invert",&joystick_strafe_invert);
+    M_BindIntVariable("joystick_look_axis",    &joystick_look_axis);
+    M_BindIntVariable("joystick_look_invert",  &joystick_look_invert);
 
     for (i = 0; i < NUM_VIRTUAL_BUTTONS; ++i)
     {
--- a/src/m_config.c
+++ b/src/m_config.c
@@ -1105,6 +1105,19 @@
     CONFIG_VARIABLE_INT(joystick_strafe_invert),
 
     //!
+    // Joystick axis to use to for looking up and down.
+    //
+
+    CONFIG_VARIABLE_INT(joystick_look_axis),
+
+    //!
+    // If non-zero, movement on the joystick axis used for looking
+    // is inverted.
+    //
+
+    CONFIG_VARIABLE_INT(joystick_look_invert),
+
+    //!
     // The physical joystick button that corresponds to joystick
     // virtual button #0.
     //
--- a/src/setup/joystick.c
+++ b/src/setup/joystick.c
@@ -80,6 +80,11 @@
 static int joystick_strafe_axis = -1;
 static int joystick_strafe_invert = 0;
 
+// Look axis.
+
+static int joystick_look_axis = -1;
+static int joystick_look_invert = 0;
+
 // Virtual to physical mapping.
 int joystick_physical_buttons[NUM_VIRTUAL_BUTTONS] = {
     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
@@ -133,6 +138,8 @@
     {"joystick_y_invert",          0},
     {"joystick_strafe_axis",       -1},
     {"joystick_strafe_invert",     0},
+    {"joystick_look_axis",         -1},
+    {"joystick_look_invert",       0},
     {"joyb_fire",                  -1},
     {"joyb_use",                   -1},
     {"joyb_strafe",                -1},
@@ -1021,10 +1028,26 @@
                    TXT_TABLE_OVERFLOW_RIGHT,
                    TXT_TABLE_EMPTY,
                    TXT_TABLE_EMPTY,
+                   NULL);
 
-                   TXT_NewSeparator("Buttons"),
+    if (gamemission >= heretic) // heretic, hexen, strife
+    {
+        TXT_AddWidgets(window,
+                   TXT_NewLabel("Look up/down"),
+                   TXT_NewJoystickAxis(&joystick_look_axis,
+                                       &joystick_look_invert,
+                                        JOYSTICK_AXIS_VERTICAL),
+                   TXT_TABLE_OVERFLOW_RIGHT,
+                   TXT_TABLE_OVERFLOW_RIGHT,
+                   TXT_TABLE_EMPTY,
+                   TXT_TABLE_EMPTY,
                    NULL);
+    }
 
+    TXT_AddWidgets(window,
+               TXT_NewSeparator("Buttons"),
+               NULL);
+
     AddJoystickControl(window, "Fire/Attack", &joybfire);
     AddJoystickControl(window, "Strafe Left", &joybstrafeleft);
 
@@ -1076,6 +1099,8 @@
     M_BindIntVariable("joystick_x_invert",      &joystick_x_invert);
     M_BindIntVariable("joystick_y_invert",      &joystick_y_invert);
     M_BindIntVariable("joystick_strafe_invert", &joystick_strafe_invert);
+    M_BindIntVariable("joystick_look_axis",   &joystick_look_axis);
+    M_BindIntVariable("joystick_look_invert", &joystick_look_invert);
 
     for (i = 0; i < NUM_VIRTUAL_BUTTONS; ++i)
     {
--- a/src/strife/g_game.c
+++ b/src/strife/g_game.c
@@ -219,6 +219,7 @@
 static int      joyxmove;
 static int      joyymove;
 static int      joystrafemove;
+static int      joylook;
 static boolean  joyarray[MAX_JOY_BUTTONS + 1]; 
 static boolean *joybuttons = &joyarray[1];		// allow [-1] 
  
@@ -343,11 +344,11 @@
         consistancy[consoleplayer][maketic%BACKUPTICS]; 
 
     // villsa [STRIFE] look up key
-    if(gamekeydown[key_lookup])
+    if(gamekeydown[key_lookup] || joylook < 0)
         cmd->buttons2 |= BT2_LOOKUP;
 
     // villsa [STRIFE] look down key
-    if(gamekeydown[key_lookdown])
+    if(gamekeydown[key_lookdown] || joylook > 0)
         cmd->buttons2 |= BT2_LOOKDOWN;
 
     // villsa [STRIFE] inventory use key
@@ -699,7 +700,7 @@
     // clear cmd building stuff
 
     memset (gamekeydown, 0, sizeof(gamekeydown));
-    joyxmove = joyymove = joystrafemove = 0;
+    joyxmove = joyymove = joystrafemove = joylook = 0;
     mousex = mousey = 0;
     sendpause = sendsave = paused = false;
     memset(mousearray, 0, sizeof(mousearray));
@@ -880,6 +881,7 @@
         joyxmove = ev->data2; 
         joyymove = ev->data3; 
         joystrafemove = ev->data4;
+        joylook = ev->data5;
         return true;    // eat events 
 
     default: