summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsvdijk2013-12-23 14:45:20 +0100
committersvdijk2013-12-23 14:45:20 +0100
commit5a35c4381b1559e5d12709f9692de4984f9c64e6 (patch)
tree29f30cc466525d6e58a18b771d7c52698ec3d715 /src
parenta658822289e10e37363fc60153492738fb43095a (diff)
downloadchocolate-doom-5a35c4381b1559e5d12709f9692de4984f9c64e6.tar.gz
chocolate-doom-5a35c4381b1559e5d12709f9692de4984f9c64e6.tar.bz2
chocolate-doom-5a35c4381b1559e5d12709f9692de4984f9c64e6.zip
heretic, hexen: Fix mouse (and joystick) weapon cycling.
Implement this the same way it is implemented for doom and strife.
Diffstat (limited to 'src')
-rw-r--r--src/heretic/g_game.c52
-rw-r--r--src/hexen/g_game.c64
2 files changed, 103 insertions, 13 deletions
diff --git a/src/heretic/g_game.c b/src/heretic/g_game.c
index e9302e83..20858cb7 100644
--- a/src/heretic/g_game.c
+++ b/src/heretic/g_game.c
@@ -185,7 +185,7 @@ int turnheld; // for accelerative turning
int lookheld;
-boolean mousearray[4];
+boolean mousearray[MAX_MOUSE_BUTTONS + 1];
boolean *mousebuttons = &mousearray[1];
// allow [-1]
int mousex, mousey; // mouse values are used once
@@ -681,7 +681,51 @@ static void SetJoyButtons(unsigned int buttons_mask)
for (i=0; i<MAX_JOY_BUTTONS; ++i)
{
- joybuttons[i] = (buttons_mask & (1 << i)) != 0;
+ int button_on = (buttons_mask & (1 << i)) != 0;
+
+ // Detect button press:
+
+ if (!joybuttons[i] && button_on)
+ {
+ // Weapon cycling:
+
+ if (i == joybprevweapon)
+ {
+ next_weapon = -1;
+ }
+ else if (i == joybnextweapon)
+ {
+ next_weapon = 1;
+ }
+ }
+
+ joybuttons[i] = button_on;
+ }
+}
+
+static void SetMouseButtons(unsigned int buttons_mask)
+{
+ int i;
+
+ for (i=0; i<MAX_MOUSE_BUTTONS; ++i)
+ {
+ unsigned int button_on = (buttons_mask & (1 << i)) != 0;
+
+ // Detect button press:
+
+ if (!mousebuttons[i] && button_on)
+ {
+ if (i == mousebprevweapon)
+ {
+ next_weapon = -1;
+ }
+ else if (i == mousebnextweapon)
+ {
+ next_weapon = 1;
+ }
+ }
+
+ mousebuttons[i] = button_on;
}
}
@@ -826,9 +870,7 @@ boolean G_Responder(event_t * ev)
return (false); // always let key up events filter down
case ev_mouse:
- mousebuttons[0] = ev->data1 & 1;
- mousebuttons[1] = ev->data1 & 2;
- mousebuttons[2] = ev->data1 & 4;
+ SetMouseButtons(ev->data1);
mousex = ev->data2 * (mouseSensitivity + 5) / 10;
mousey = ev->data3 * (mouseSensitivity + 5) / 10;
return (true); // eat events
diff --git a/src/hexen/g_game.c b/src/hexen/g_game.c
index a304d0f6..a448134b 100644
--- a/src/hexen/g_game.c
+++ b/src/hexen/g_game.c
@@ -152,7 +152,7 @@ int turnheld; // for accelerative turning
int lookheld;
-boolean mousearray[4];
+boolean mousearray[MAX_MOUSE_BUTTONS + 1];
boolean *mousebuttons = &mousearray[1];
// allow [-1]
int mousex, mousey; // mouse values are used once
@@ -671,6 +671,59 @@ void G_DoLoadLevel(void)
}
}
+static void SetJoyButtons(unsigned int buttons_mask)
+{
+ int i;
+
+ for (i=0; i<MAX_JOY_BUTTONS; ++i)
+ {
+ int button_on = (buttons_mask & (1 << i)) != 0;
+
+ // Detect button press:
+
+ if (!joybuttons[i] && button_on)
+ {
+ // Weapon cycling:
+
+ if (i == joybprevweapon)
+ {
+ next_weapon = -1;
+ }
+ else if (i == joybnextweapon)
+ {
+ next_weapon = 1;
+ }
+ }
+
+ joybuttons[i] = button_on;
+ }
+}
+
+static void SetMouseButtons(unsigned int buttons_mask)
+{
+ int i;
+
+ for (i=0; i<MAX_MOUSE_BUTTONS; ++i)
+ {
+ unsigned int button_on = (buttons_mask & (1 << i)) != 0;
+
+ // Detect button press:
+
+ if (!mousebuttons[i] && button_on)
+ {
+ if (i == mousebprevweapon)
+ {
+ next_weapon = -1;
+ }
+ else if (i == mousebnextweapon)
+ {
+ next_weapon = 1;
+ }
+ }
+
+ mousebuttons[i] = button_on;
+ }
+}
/*
===============================================================================
@@ -814,18 +867,13 @@ boolean G_Responder(event_t * ev)
return (false); // always let key up events filter down
case ev_mouse:
- mousebuttons[0] = ev->data1 & 1;
- mousebuttons[1] = ev->data1 & 2;
- mousebuttons[2] = ev->data1 & 4;
+ SetMouseButtons(ev->data1);
mousex = ev->data2 * (mouseSensitivity + 5) / 10;
mousey = ev->data3 * (mouseSensitivity + 5) / 10;
return (true); // eat events
case ev_joystick:
- joybuttons[0] = ev->data1 & 1;
- joybuttons[1] = ev->data1 & 2;
- joybuttons[2] = ev->data1 & 4;
- joybuttons[3] = ev->data1 & 8;
+ SetJoyButtons(ev->data1);
joyxmove = ev->data2;
joyymove = ev->data3;
return (true); // eat events