diff --git a/src/spfx.c b/src/spfx.c
index ff039ea..bc1cfe9 100644
--- a/src/spfx.c
+++ b/src/spfx.c
@@ -87,7 +87,7 @@ static void spfx_destroy(SPFX* layer, int* nlayer, int spfx);
 static void spfx_update_layer(SPFX* layer, int* nlayer, const double dt);
 /* Haptic. */
 static int spfx_hapticInit(void);
-static void spfx_hapticRumble(void);
+static void spfx_hapticRumble(double mod);
 
 /**
  * @brief Load an SPFX_Base into the stack based on some params.
@@ -374,7 +374,7 @@ void spfx_shake(double mod) {
   vect_pset(&shake_vel, SHAKE_VEL_MOD*shake_rad, RNGF() * 2. * M_PI);
 
   /* Rumble if it wasn't rumbling before. */
-  spfx_hapticRumble();
+  spfx_hapticRumble(mod);
 
   /* Notify that rumble is active. */
   shake_off = 0;
@@ -409,15 +409,16 @@ static int spfx_hapticInit(void) {
 
 /**
  * @brief Run a rumble effect.
+ *    @param mod Current modifier being added.
  */
-static void spfx_hapticRumble(void) {
+static void spfx_hapticRumble(double mod) {
 #if SDL_VERSION_ATLEAST(1,3,0)
   SDL_HapticEffect* efx;
   double len, mag;
 
   if(haptic_rumble >= 0) {
     /* Not time to update yet. */
-    if((haptic_lastUpdate > 0.) || shake_off)
+    if((haptic_lastUpdate > 0.) || shake_off || (mod > SHAKE_MAX/3.))
       return;
 
     /* Stop the effect if it was playing. */
@@ -443,6 +444,8 @@ static void spfx_hapticRumble(void) {
     /* Set timer again. */
     haptic_lastUpdate = HAPTIC_UPDATE_INTERVAL;
   }
+#else
+  (void)mod;
 #endif
 }