rnd-20070420-2-src
[rocksndiamonds.git] / src / events.c
index 134a5e73f536a54d9ac7288c7502df7a69a62ce5..811d8f9ae87e01fdfc9b03eddfa96f93823a7160 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment                      *
+* (c) 1995-2006 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
@@ -24,6 +24,9 @@
 #include "network.h"
 
 
+#define        DEBUG_EVENTS            0
+
+
 static boolean cursor_inside_playfield = FALSE;
 static boolean playfield_cursor_set = FALSE;
 static unsigned long playfield_cursor_delay = 0;
@@ -124,7 +127,7 @@ void EventLoop(void)
 
       while (NextValidEvent(&event))
       {
-       switch(event.type)
+       switch (event.type)
        {
          case EVENT_BUTTONPRESS:
          case EVENT_BUTTONRELEASE:
@@ -191,7 +194,7 @@ void EventLoop(void)
 
 void HandleOtherEvents(Event *event)
 {
-  switch(event->type)
+  switch (event->type)
   {
     case EVENT_EXPOSE:
       HandleExposeEvent((ExposeEvent *) event);
@@ -235,14 +238,18 @@ void ClearEventQueue()
 
     NextEvent(&event);
 
-    switch(event.type)
+    switch (event.type)
     {
       case EVENT_BUTTONRELEASE:
        button_status = MB_RELEASED;
        break;
 
       case EVENT_KEYRELEASE:
+#if 1
+       ClearPlayerAction();
+#else
        key_joystick_mapping = 0;
+#endif
        break;
 
       default:
@@ -274,7 +281,7 @@ void SleepWhileUnmapped()
 
     NextEvent(&event);
 
-    switch(event.type)
+    switch (event.type)
     {
       case EVENT_BUTTONRELEASE:
        button_status = MB_RELEASED;
@@ -315,6 +322,11 @@ void HandleExposeEvent(ExposeEvent *event)
 
 void HandleButtonEvent(ButtonEvent *event)
 {
+#if DEBUG_EVENTS
+  printf("::: BUTTON EVENT: button %d %s\n", event->button,
+        event->type == EVENT_BUTTONPRESS ? "pressed" : "released");
+#endif
+
   motion_status = FALSE;
 
   if (event->type == EVENT_BUTTONPRESS)
@@ -322,7 +334,7 @@ void HandleButtonEvent(ButtonEvent *event)
   else
     button_status = MB_RELEASED;
 
-  HandleButton(event->x, event->y, button_status);
+  HandleButton(event->x, event->y, button_status, event->button);
 }
 
 void HandleMotionEvent(MotionEvent *event)
@@ -335,7 +347,7 @@ void HandleMotionEvent(MotionEvent *event)
 
   motion_status = TRUE;
 
-  HandleButton(event->x, event->y, button_status);
+  HandleButton(event->x, event->y, button_status, button_status);
 }
 
 void HandleKeyEvent(KeyEvent *event)
@@ -345,6 +357,11 @@ void HandleKeyEvent(KeyEvent *event)
   Key key = GetEventKey(event, with_modifiers);
   Key keymod = (with_modifiers ? GetEventKey(event, FALSE) : key);
 
+#if DEBUG_EVENTS
+  printf("::: KEY EVENT: %d %s\n", GetEventKey(event, TRUE),
+        event->type == EVENT_KEYPRESS ? "pressed" : "released");
+#endif
+
   HandleKeyModState(keymod, key_status);
   HandleKey(key, key_status);
 }
@@ -396,7 +413,7 @@ void HandleClientMessageEvent(ClientMessageEvent *event)
     CloseAllAndExit(0);
 }
 
-void HandleButton(int mx, int my, int button)
+void HandleButton(int mx, int my, int button, int button_nr)
 {
   static int old_mx = 0, old_my = 0;
 
@@ -418,14 +435,18 @@ void HandleButton(int mx, int my, int button)
     mx = my = -32;     /* force mouse event to be outside screen tiles */
   }
 
-  switch(game_status)
+  /* do not use scroll wheel button events for anything other than gadgets */
+  if (IS_WHEEL_BUTTON(button_nr))
+    return;
+
+  switch (game_status)
   {
     case GAME_MODE_TITLE:
-      HandleTitleScreen(mx,my, 0,0, button);
+      HandleTitleScreen(mx, my, 0, 0, button);
       break;
 
     case GAME_MODE_MAIN:
-      HandleMainMenu(mx,my, 0,0, button);
+      HandleMainMenu(mx, my, 0, 0, button);
       break;
 
     case GAME_MODE_PSEUDO_TYPENAME:
@@ -433,11 +454,11 @@ void HandleButton(int mx, int my, int button)
       break;
 
     case GAME_MODE_LEVELS:
-      HandleChooseLevel(mx,my, 0,0, button);
+      HandleChooseLevel(mx, my, 0, 0, button);
       break;
 
     case GAME_MODE_SCORES:
-      HandleHallOfFame(0,0, 0,0, button);
+      HandleHallOfFame(0, 0, 0, 0, button);
       break;
 
     case GAME_MODE_EDITOR:
@@ -445,11 +466,11 @@ void HandleButton(int mx, int my, int button)
       break;
 
     case GAME_MODE_INFO:
-      HandleInfoScreen(mx,my, 0,0, button);
+      HandleInfoScreen(mx, my, 0, 0, button);
       break;
 
     case GAME_MODE_SETUP:
-      HandleSetupScreen(mx,my, 0,0, button);
+      HandleSetupScreen(mx, my, 0, 0, button);
       break;
 
     case GAME_MODE_PLAYING:
@@ -498,7 +519,7 @@ static void HandleKeysSpecial(Key key)
   cheat_input[cheat_input_len++] = letter;
   cheat_input[cheat_input_len] = '\0';
 
-#if 0
+#if DEBUG_EVENTS
   printf("::: '%s' [%d]\n", cheat_input, cheat_input_len);
 #endif
 
@@ -646,8 +667,18 @@ void HandleKey(Key key, int key_status)
          element_dropped[pnr] = FALSE;
        }
       }
+#if 1
+      else if (tape.recording && tape.pausing)
+      {
+       /* prevent key release events from un-pausing a paused game */
+       if (key_status == KEY_PRESSED &&
+           (key_action & KEY_ACTION))
+         TapeTogglePause(TAPE_TOGGLE_MANUAL);
+      }
+#else
       else if (tape.recording && tape.pausing && (key_action & KEY_ACTION))
        TapeTogglePause(TAPE_TOGGLE_MANUAL);
+#endif
     }
   }
   else
@@ -673,12 +704,28 @@ void HandleKey(Key key, int key_status)
   if (key_status == KEY_RELEASED)
     return;
 
+  if ((key == KSYM_Return || key == KSYM_KP_Enter) &&
+      (GetKeyModState() & KMOD_Alt) && video.fullscreen_available)
+  {
+    setup.fullscreen = !setup.fullscreen;
+
+    ToggleFullscreenIfNeeded();
+
+    if (game_status == GAME_MODE_SETUP)
+      RedrawSetupScreenAfterFullscreenToggle();
+
+    return;
+  }
+
+#if 0
+  if (game_status == GAME_MODE_PLAYING && local_player->LevelSolved_GameEnd &&
+      (key == KSYM_Return || key == setup.shortcut.toggle_pause))
+#else
   if (game_status == GAME_MODE_PLAYING && AllPlayersGone &&
       (key == KSYM_Return || key == setup.shortcut.toggle_pause))
+#endif
   {
-    CloseDoor(DOOR_CLOSE_1);
-    game_status = GAME_MODE_MAIN;
-    DrawMainMenu();
+    GameEnd();
 
     return;
   }
@@ -733,7 +780,7 @@ void HandleKey(Key key, int key_status)
       key = KSYM_UNDEFINED;
   }
 
-  switch(game_status)
+  switch (game_status)
   {
     case GAME_MODE_PSEUDO_TYPENAME:
       HandleTypeName(0, key);
@@ -744,54 +791,61 @@ void HandleKey(Key key, int key_status)
     case GAME_MODE_LEVELS:
     case GAME_MODE_SETUP:
     case GAME_MODE_INFO:
-      switch(key)
+    case GAME_MODE_SCORES:
+      switch (key)
       {
-#if 1
-       case KSYM_space:
-#else
-       /* !!! only use "space" key to start game from main menu !!! */
        case KSYM_space:
-#endif
        case KSYM_Return:
          if (game_status == GAME_MODE_TITLE)
-           HandleTitleScreen(0,0, 0,0, MB_MENU_CHOICE);
+           HandleTitleScreen(0, 0, 0, 0, MB_MENU_CHOICE);
          else if (game_status == GAME_MODE_MAIN)
-           HandleMainMenu(0,0, 0,0, MB_MENU_CHOICE);
+           HandleMainMenu(0, 0, 0, 0, MB_MENU_CHOICE);
           else if (game_status == GAME_MODE_LEVELS)
-            HandleChooseLevel(0,0, 0,0, MB_MENU_CHOICE);
+            HandleChooseLevel(0, 0, 0, 0, MB_MENU_CHOICE);
          else if (game_status == GAME_MODE_SETUP)
-           HandleSetupScreen(0,0, 0,0, MB_MENU_CHOICE);
+           HandleSetupScreen(0, 0, 0, 0, MB_MENU_CHOICE);
          else if (game_status == GAME_MODE_INFO)
-           HandleInfoScreen(0,0, 0,0, MB_MENU_CHOICE);
+           HandleInfoScreen(0, 0, 0, 0, MB_MENU_CHOICE);
+         else if (game_status == GAME_MODE_SCORES)
+           HandleHallOfFame(0, 0, 0, 0, MB_MENU_CHOICE);
          break;
 
        case KSYM_Escape:
+         if (game_status != GAME_MODE_MAIN)
+           FadeSkipNextFadeIn();
+
          if (game_status == GAME_MODE_TITLE)
-           HandleTitleScreen(0,0, 0,0, MB_MENU_LEAVE);
+           HandleTitleScreen(0, 0, 0, 0, MB_MENU_LEAVE);
           else if (game_status == GAME_MODE_LEVELS)
-            HandleChooseLevel(0,0, 0,0, MB_MENU_LEAVE);
+            HandleChooseLevel(0, 0, 0, 0, MB_MENU_LEAVE);
          else if (game_status == GAME_MODE_SETUP)
-           HandleSetupScreen(0,0, 0,0, MB_MENU_LEAVE);
+           HandleSetupScreen(0, 0, 0, 0, MB_MENU_LEAVE);
          else if (game_status == GAME_MODE_INFO)
-           HandleInfoScreen(0,0, 0,0, MB_MENU_LEAVE);
+           HandleInfoScreen(0, 0, 0, 0, MB_MENU_LEAVE);
+         else if (game_status == GAME_MODE_SCORES)
+           HandleHallOfFame(0, 0, 0, 0, MB_MENU_LEAVE);
          break;
 
         case KSYM_Page_Up:
           if (game_status == GAME_MODE_LEVELS)
-            HandleChooseLevel(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
+            HandleChooseLevel(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
          else if (game_status == GAME_MODE_SETUP)
-           HandleSetupScreen(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
+           HandleSetupScreen(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
          else if (game_status == GAME_MODE_INFO)
-           HandleInfoScreen(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
+           HandleInfoScreen(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
+         else if (game_status == GAME_MODE_SCORES)
+           HandleHallOfFame(0, 0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
          break;
 
         case KSYM_Page_Down:
           if (game_status == GAME_MODE_LEVELS)
-            HandleChooseLevel(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
+            HandleChooseLevel(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
          else if (game_status == GAME_MODE_SETUP)
-           HandleSetupScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
+           HandleSetupScreen(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
          else if (game_status == GAME_MODE_INFO)
-           HandleInfoScreen(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
+           HandleInfoScreen(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
+         else if (game_status == GAME_MODE_SCORES)
+           HandleHallOfFame(0, 0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
          break;
 
 #ifdef DEBUG
@@ -805,29 +859,6 @@ void HandleKey(Key key, int key_status)
       }
       break;
 
-    case GAME_MODE_SCORES:
-      switch(key)
-      {
-       case KSYM_space:
-       case KSYM_Return:
-       case KSYM_Escape:
-         game_status = GAME_MODE_MAIN;
-         DrawMainMenu();
-         break;
-
-        case KSYM_Page_Up:
-         HandleHallOfFame(0,0, 0, -1 * SCROLL_PAGE, MB_MENU_MARK);
-         break;
-
-        case KSYM_Page_Down:
-         HandleHallOfFame(0,0, 0, +1 * SCROLL_PAGE, MB_MENU_MARK);
-         break;
-
-       default:
-         break;
-      }
-      break;
-
     case GAME_MODE_EDITOR:
       if (!anyTextGadgetActiveOrJustFinished || key == KSYM_Escape)
        HandleLevelEditorKeyInput(key);
@@ -835,7 +866,7 @@ void HandleKey(Key key, int key_status)
 
     case GAME_MODE_PLAYING:
     {
-      switch(key)
+      switch (key)
       {
         case KSYM_Escape:
          RequestQuitGame(setup.ask_on_escape);
@@ -947,7 +978,8 @@ void HandleNoEvent()
 {
   if (button_status && game_status != GAME_MODE_PLAYING)
   {
-    HandleButton(0, 0, -button_status);
+    HandleButton(0, 0, -button_status, button_status);
+
     return;
   }
 
@@ -999,7 +1031,7 @@ void HandleJoystick()
   int dx       = (left ? -1    : right ? 1     : 0);
   int dy       = (up   ? -1    : down  ? 1     : 0);
 
-  switch(game_status)
+  switch (game_status)
   {
     case GAME_MODE_TITLE:
     case GAME_MODE_MAIN:
@@ -1014,20 +1046,20 @@ void HandleJoystick()
        newbutton = dx = dy = 0;
 
       if (game_status == GAME_MODE_TITLE)
-       HandleTitleScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
+       HandleTitleScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
       else if (game_status == GAME_MODE_MAIN)
-       HandleMainMenu(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
+       HandleMainMenu(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
       else if (game_status == GAME_MODE_LEVELS)
-        HandleChooseLevel(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
+        HandleChooseLevel(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
       else if (game_status == GAME_MODE_SETUP)
-       HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
+       HandleSetupScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
       else if (game_status == GAME_MODE_INFO)
-       HandleInfoScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
+       HandleInfoScreen(0,0,dx,dy, newbutton ? MB_MENU_CHOICE : MB_MENU_MARK);
       break;
     }
 
     case GAME_MODE_SCORES:
-      HandleHallOfFame(0,0, dx,dy, !newbutton);
+      HandleHallOfFame(0, 0, dx, dy, !newbutton);
       break;
 
     case GAME_MODE_EDITOR:
@@ -1038,11 +1070,14 @@ void HandleJoystick()
       if (tape.playing || keyboard)
        newbutton = ((joy & JOY_BUTTON) != 0);
 
+#if 0
+      if (local_player->LevelSolved_GameEnd && newbutton)
+#else
       if (AllPlayersGone && newbutton)
+#endif
       {
-       CloseDoor(DOOR_CLOSE_1);
-       game_status = GAME_MODE_MAIN;
-       DrawMainMenu();
+       GameEnd();
+
        return;
       }