fixed CE condition that checks touching the player at some side
[rocksndiamonds.git] / src / events.c
index 02378a71bd180f1423d82b33d0bdd3ad573bdc80..d9ba05860c5c30011bd6591314127116e1766af6 100644 (file)
@@ -1697,6 +1697,7 @@ void HandleButton(int mx, int my, int button, int button_nr)
   static int old_mx = 0, old_my = 0;
   boolean button_hold = FALSE;
   boolean handle_gadgets = TRUE;
+  int game_status_last = game_status;
 
   if (button_nr < 0)
   {
@@ -1741,8 +1742,12 @@ void HandleButton(int mx, int my, int button, int button_nr)
 
   if (handle_gadgets && HandleGadgets(mx, my, button))
   {
-    // do not handle this button event anymore
+    // do not handle this button event anymore with position on screen
     mx = my = -32;     // force mouse event to be outside screen tiles
+
+    // do not handle this button event anymore if game status has changed
+    if (game_status != game_status_last)
+      return;
   }
 
   if (button_hold && game_status == GAME_MODE_PLAYING && tape.pausing)
@@ -2199,6 +2204,9 @@ void HandleKey(Key key, int key_status)
     // reset flag to ignore repeated "key pressed" events after key release
     ignore_repeated_key = FALSE;
 
+    // send key release event to global animation event handling
+    HandleGlobalAnimClicks(-1, -1, KEY_RELEASED, FALSE);
+
     return;
   }
 
@@ -2282,7 +2290,8 @@ void HandleKey(Key key, int key_status)
   }
 
   if (game_status == GAME_MODE_MAIN &&
-      setup.internal.info_screens_from_main &&
+      (setup.internal.info_screens_from_main ||
+       leveldir_current->info_screens_from_main) &&
       (key >= KSYM_KP_1 && key <= KSYM_KP_9))
   {
     DrawInfoScreen_FromMainMenu(key - KSYM_KP_1 + 1);
@@ -2547,14 +2556,14 @@ static void HandleTileCursor(int dx, int dy, int button)
   {
     int old_xpos = tile_cursor.xpos;
     int old_ypos = tile_cursor.ypos;
-    int new_xpos = old_xpos;
-    int new_ypos = old_ypos;
+    int new_xpos = tile_cursor.xpos + dx;
+    int new_ypos = tile_cursor.ypos + dy;
 
-    if (IN_LEV_FIELD(old_xpos + dx, old_ypos))
-      new_xpos = old_xpos + dx;
+    if (!IN_LEV_FIELD(new_xpos, old_ypos) || !IN_SCR_FIELD(new_xpos, old_ypos))
+      new_xpos = old_xpos;
 
-    if (IN_LEV_FIELD(old_xpos, old_ypos + dy))
-      new_ypos = old_ypos + dy;
+    if (!IN_LEV_FIELD(old_xpos, new_ypos) || !IN_SCR_FIELD(old_xpos, new_ypos))
+      new_ypos = old_ypos;
 
     SetTileCursorTargetXY(new_xpos, new_ypos);
   }
@@ -2608,12 +2617,15 @@ void HandleJoystick(void)
   int up       = joy & JOY_UP;
   int down     = joy & JOY_DOWN;
   int button   = joy & JOY_BUTTON;
-  int newbutton        = (AnyJoystickButton() == JOY_BUTTON_NEW_PRESSED);
+  int anybutton = AnyJoystickButton();
+  int newbutton        = (anybutton == JOY_BUTTON_NEW_PRESSED);
   int dx       = (left ? -1    : right ? 1     : 0);
   int dy       = (up   ? -1    : down  ? 1     : 0);
   boolean use_delay_value_first = (joytest != joytest_last);
+  boolean new_button_event = (anybutton == JOY_BUTTON_NEW_PRESSED ||
+                             anybutton == JOY_BUTTON_NEW_RELEASED);
 
-  if (HandleGlobalAnimClicks(-1, -1, newbutton, FALSE))
+  if (new_button_event && HandleGlobalAnimClicks(-1, -1, newbutton, FALSE))
   {
     // do not handle this button event anymore
     return;