shithub: choc

Download patch

ref: 9e59e9a4ee51817bf7d825240698828efdda7ced
parent: 62c8b62c5efa78dadf25a3ffdcdfe84601ef33d0
parent: ef9b45168fcf24418f6fdb42743dc3766ca78de3
author: Jonathan Dowland <jon+github@alcopop.org>
date: Fri Oct 13 06:17:14 EDT 2017

Merge pull request #948 from jmtd/joypad-look

Permit binding of joystick axes to look up/down

--- a/src/d_event.h
+++ b/src/d_event.h
@@ -59,6 +59,7 @@
     //    data2: X axis mouse movement (turn).
     //    data3: Y axis mouse movement (forward/backward).
     //    data4: Third axis mouse movement (strafe).
+    //    data5: Fourth axis mouse movement (look)
     ev_joystick,
 
     // Quit event. Triggered when the user clicks the "close" button
@@ -72,7 +73,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,24 @@
                    TXT_TABLE_OVERFLOW_RIGHT,
                    TXT_TABLE_EMPTY,
                    TXT_TABLE_EMPTY,
+                   NULL);
 
-                   TXT_NewSeparator("Buttons"),
+    if (gamemission == heretic || gamemission == hexen || gamemission == 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_AddWidget(window, TXT_NewSeparator("Buttons"));
+
     AddJoystickControl(window, "Fire/Attack", &joybfire);
     AddJoystickControl(window, "Strafe Left", &joybstrafeleft);
 
@@ -1076,6 +1097,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: