diff --git a/src/defs.h b/src/defs.h
index 685c3ab..3255608 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -103,6 +103,9 @@ along with this program. If not, see .
#define BRIEFING_WIDTH 520
+#define JS_DEADZONE 0.05
+#define JS_MAX (32767 - JS_DEADZONE*32767)
+
// Object Flags
#define FL_WEAPCO (1L << 0)
#define FL_FRIEND (1L << 1)
diff --git a/src/engine.c b/src/engine.c
index 4ab0669..e434531 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -103,6 +103,9 @@ void engine_init()
for (int i = 0; i < KEY_LAST; i++)
engine.keyState[i] = 0;
+ engine.xaxis = 0;
+ engine.yaxis = 0;
+
engine.eventTimer = 0;
engine.counter2 = 0;
engine.timeTaken = 0;
diff --git a/src/engine.h b/src/engine.h
index 4ec6688..5b3ece8 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -92,7 +92,9 @@ typedef struct Engine_ {
char configDirectory[PATH_MAX];
- char keyState[KEY_LAST];
+ int keyState[KEY_LAST];
+ double xaxis;
+ double yaxis;
int cheat; // overall cheat
int cheatShield;
diff --git a/src/game.c b/src/game.c
index 1db48c1..5d2ef80 100644
--- a/src/game.c
+++ b/src/game.c
@@ -1339,6 +1339,8 @@ static void game_doPlayer()
int shapeToUse;
float cd;
float cc;
+ double xm = 0;
+ double ym = 0;
int xmoved = 0;
int ymoved = 0;
char msg[STRMAX];
@@ -1444,34 +1446,27 @@ static void game_doPlayer()
LIMIT_ADD(player.reload[0], -1, 0, 999);
LIMIT_ADD(player.reload[1], -1, 0, 999);
- if (engine.keyState[KEY_UP])
+ xm = engine.keyState[KEY_RIGHT] - engine.keyState[KEY_LEFT];
+ if (!xm)
+ xm = engine.xaxis;
+
+ if (xm)
{
- player.y -= player.speed;
- engine.ssy += 0.1;
- ymoved = 1;
- }
-
- if (engine.keyState[KEY_DOWN])
- {
- player.y += player.speed;
- engine.ssy -= 0.1;
- ymoved = 1;
- }
-
- if (engine.keyState[KEY_LEFT])
- {
- player.x -= player.speed;
- engine.ssx += 0.1;
- player.face = 1;
+ player.x += xm * player.speed;
+ engine.ssx -= xm * 0.1;
+ player.face = (xm < 0 ? 1 : 0);
xmoved = 1;
}
- if (engine.keyState[KEY_RIGHT])
+ ym = engine.keyState[KEY_DOWN] - engine.keyState[KEY_UP];
+ if (!ym)
+ ym = engine.yaxis;
+
+ if (ym)
{
- player.x += player.speed;
- engine.ssx -= 0.1;
- player.face = 0;
- xmoved = 1;
+ player.y += ym * player.speed;
+ engine.ssy -= ym * 0.1;
+ ymoved = 1;
}
if (engine.keyState[KEY_ESCAPE])
@@ -1650,6 +1645,8 @@ static void game_doPlayer()
engine.keyState[KEY_DOWN] = 0;
engine.keyState[KEY_LEFT] = 0;
engine.keyState[KEY_RIGHT] = 0;
+ engine.xaxis = 0;
+ engine.yaxis = 0;
if (CHANCE(1. / 3.))
explosion_add(player.x + RANDRANGE(-10, 10),
player.y + RANDRANGE(-10, 10), SP_BIG_EXPLOSION);
@@ -2705,6 +2702,8 @@ int game_mainLoop()
engine.keyState[KEY_RIGHT] = 0;
engine.keyState[KEY_FIRE] = 0;
engine.keyState[KEY_ALTFIRE] = 0;
+ engine.xaxis = 0;
+ engine.yaxis = 0;
LIMIT_ADD(engine.musicVolume, -0.2, 0, 100);
audio_setMusicVolume(engine.musicVolume);
}
diff --git a/src/player.c b/src/player.c
index 6e5c550..42d5ca1 100644
--- a/src/player.c
+++ b/src/player.c
@@ -17,6 +17,9 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
+#include
+#include
+
#include "SDL.h"
#include "defs.h"
@@ -243,8 +246,7 @@ static enum keys mapkey(int code) {
void player_getInput()
{
- static int prevjoyup, prevjoydown, prevjoyleft, prevjoyright;
- int joyup, joydown, joyleft, joyright;
+ double val;
static int px = -1, py = -1;
int x, y, w, h;
@@ -315,21 +317,15 @@ void player_getInput()
break;
case SDL_JOYAXISMOTION:
- if (engine.event.jaxis.axis == 1) {
- joyup = engine.event.jaxis.value < -16384;
- joydown = engine.event.jaxis.value >= 16384;
- if (joyup != prevjoyup)
- engine.keyState[KEY_UP] = prevjoyup = joyup;
- if (joydown != prevjoydown)
- engine.keyState[KEY_DOWN] = prevjoydown = joydown;
- } else if (engine.event.jaxis.axis == 0) {
- joyleft = engine.event.jaxis.value < -16384;
- joyright = engine.event.jaxis.value >= 16384;
- if (joyleft != prevjoyleft)
- engine.keyState[KEY_LEFT] = prevjoyleft = joyleft;
- if (joyright != prevjoyright)
- engine.keyState[KEY_RIGHT] = prevjoyright = joyright;
- }
+ val = MIN(1, (double)(abs(engine.event.jaxis.value)) / JS_MAX);
+ if (val < JS_DEADZONE)
+ val = 0;
+
+ if (engine.event.jaxis.axis == 0)
+ engine.xaxis = copysign(val, engine.event.jaxis.value);
+ else if (engine.event.jaxis.axis == 1)
+ engine.yaxis = copysign(val, engine.event.jaxis.value);
+
break;
case SDL_WINDOWEVENT:
@@ -365,14 +361,18 @@ void player_getInput()
x = screen->w * x / w;
y = screen->h * y / h;
if (px == x && py == y) {
- if(engine.keyState[KEY_UP] && engine.cursor_y > 0)
+ if (engine.keyState[KEY_UP])
engine.cursor_y -= 4;
- if(engine.keyState[KEY_DOWN] && engine.cursor_y < screen->h - 4)
+ if (engine.keyState[KEY_DOWN])
engine.cursor_y += 4;
- if(engine.keyState[KEY_LEFT] && engine.cursor_x > 0)
+ if (engine.keyState[KEY_LEFT])
engine.cursor_x -= 4;
- if(engine.keyState[KEY_RIGHT] && engine.cursor_x < screen->w - 4)
+ if (engine.keyState[KEY_RIGHT])
engine.cursor_x += 4;
+ if (engine.xaxis)
+ engine.cursor_x += 10 * engine.xaxis;
+ if (engine.yaxis)
+ engine.cursor_y += 10 * engine.yaxis;
} else {
engine.cursor_x = px = x;
engine.cursor_y = py = y;