rnd-19990216-1
[rocksndiamonds.git] / src / tools.c
index 56f7de4b48eb3ec2738eedefd7fd5b88d9fa0151..258c99a6517a72c65b3c205214920884a8483bcf 100644 (file)
@@ -456,8 +456,9 @@ void DrawPlayer(struct PlayerInfo *player)
   int next_jx = jx + (jx - last_jx), next_jy = jy + (jy - last_jy);
   int sx = SCREENX(jx), sy = SCREENY(jy);
   int sxx = 0, syy = 0;
-  int element = Feld[jx][jy];
+  int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy];
   int graphic, phase;
+  boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE);
 
   if (!player->active || player->gone ||
       !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy)))
@@ -478,14 +479,18 @@ void DrawPlayer(struct PlayerInfo *player)
 
   /* draw things in the field the player is leaving, if needed */
 
+  /*
   if (last_jx != jx || last_jy != jy)
+  */
+
+  if (player_is_moving)
   {
-    if (Store[last_jx][last_jy] && IS_DRAWABLE(Feld[last_jx][last_jy]))
+    if (Store[last_jx][last_jy] && IS_DRAWABLE(last_element))
     {
       DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
       DrawLevelFieldThruMask(last_jx, last_jy);
     }
-    else if (Feld[last_jx][last_jy] == EL_DYNAMIT)
+    else if (last_element == EL_DYNAMIT)
       DrawDynamite(last_jx, last_jy);
     else
       DrawLevelField(last_jx, last_jy);
@@ -522,9 +527,12 @@ void DrawPlayer(struct PlayerInfo *player)
   if (game_emulation == EMU_SUPAPLEX)
   {
     static int last_dir = MV_LEFT;
+    int action = (player->programmed_action ? player->programmed_action :
+                 player->action);
     boolean action_moving =
-      ((player->action & (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)) &&
-       !(player->action & ~(MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)));
+      (player_is_moving ||
+       ((action & (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)) &&
+       !(action & ~(MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN))));
 
     graphic = GFX_SP_MURPHY;
 
@@ -601,7 +609,7 @@ void DrawPlayer(struct PlayerInfo *player)
   {
     int px = SCREENX(next_jx), py = SCREENY(next_jy);
 
-    if (Feld[jx][jy] == EL_SOKOBAN_FELD_LEER ||
+    if (element == EL_SOKOBAN_FELD_LEER ||
        Feld[next_jx][next_jy] == EL_SOKOBAN_FELD_VOLL)
       DrawGraphicShiftedThruMask(px, py, sxx, syy, GFX_SOKOBAN_OBJEKT,
                                 NO_CUTTING);
@@ -624,7 +632,7 @@ void DrawPlayer(struct PlayerInfo *player)
     }
   }
 
-  /* draw things in front of player (EL_DYNAMIT || EL_DYNABOMB) */
+  /* draw things in front of player (EL_DYNAMIT or EL_DYNABOMB) */
 
   if (element == EL_DYNAMIT || element == EL_DYNABOMB)
   {
@@ -647,8 +655,11 @@ void DrawPlayer(struct PlayerInfo *player)
       DrawGraphicThruMask(sx, sy, graphic + phase);
   }
 
-  if ((last_jx != jx || last_jy != jy) &&
-      Feld[last_jx][last_jy] == EL_EXPLODING)
+  /*
+  if ((last_jx != jx || last_jy != jy) && last_element == EL_EXPLODING)
+  */
+
+  if (player_is_moving && last_element == EL_EXPLODING)
   {
     int phase = Frame[last_jx][last_jy];
     int delay = 2;
@@ -658,6 +669,14 @@ void DrawPlayer(struct PlayerInfo *player)
                          GFX_EXPLOSION + ((phase - 1) / delay - 1));
   }
 
+  /* draw elements that stay over the player */
+  /* handle the field the player is leaving ... */
+  if (player_is_moving && IS_OVER_PLAYER(last_element))
+    DrawLevelField(last_jx, last_jy);
+  /* ... and the field the player is entering */
+  if (IS_OVER_PLAYER(element))
+    DrawLevelField(jx, jy);
+
   if (setup.direct_draw)
   {
     int dest_x = SX + SCREENX(MIN(jx, last_jx)) * TILEX;
@@ -936,6 +955,7 @@ void getMiniGraphicSource(int graphic, Pixmap *pixmap, int *x, int *y)
   else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE)
   {
     graphic -= GFX_START_ROCKSMORE;
+    graphic -= ((graphic / MORE_PER_LINE) * MORE_PER_LINE) / 2;
     *pixmap = pix[PIX_MORE];
     *x = MINI_MORE_STARTX + (graphic % MINI_MORE_PER_LINE) * MINI_TILEX;
     *y = MINI_MORE_STARTY + (graphic / MINI_MORE_PER_LINE) * MINI_TILEY;
@@ -1622,6 +1642,7 @@ void DrawMicroElement(int xpos, int ypos, int element)
   if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE)
   {
     graphic -= GFX_START_ROCKSMORE;
+    graphic -= ((graphic / MORE_PER_LINE) * MORE_PER_LINE) / 2;
     XCopyArea(display, pix[PIX_MORE], drawto, gc,
              MICRO_MORE_STARTX + (graphic % MICRO_MORE_PER_LINE) *MICRO_TILEX,
              MICRO_MORE_STARTY + (graphic / MICRO_MORE_PER_LINE) *MICRO_TILEY,
@@ -1841,12 +1862,7 @@ boolean Request(char *text, unsigned int req_state)
            DOOR_GFX_PAGEX2, DOOR_GFX_PAGEY1);
 
   /* clear door drawing field */
-#if 0
-  XFillRectangle(display, pix[PIX_DB_DOOR], gc,
-                DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1, DXSIZE, DYSIZE);
-#else
   XFillRectangle(display, drawto, gc, DX, DY, DXSIZE, DYSIZE);
-#endif
 
   /* write text for request */
   for(ty=0; ty<13; ty++)
@@ -1871,37 +1887,12 @@ boolean Request(char *text, unsigned int req_state)
     }
     sprintf(txt, text); 
     txt[tl] = 0;
-#if 0
-    DrawTextExt(pix[PIX_DB_DOOR], gc,
-               DOOR_GFX_PAGEX1 + 51 - (tl * 14)/2, SY + ty * 16,
-               txt, FS_SMALL, FC_YELLOW);
-#else
     DrawTextExt(drawto, gc,
                DX + 51 - (tl * 14)/2, DY + 8 + ty * 16,
                txt, FS_SMALL, FC_YELLOW);
-#endif
     text += tl + (tc == 32 ? 1 : 0);
   }
 
-#if 0
-  if (req_state & REQ_ASK)
-  {
-    DrawYesNoButton(BUTTON_OK, DB_INIT);
-    DrawYesNoButton(BUTTON_NO, DB_INIT);
-  }
-  else if (req_state & REQ_CONFIRM)
-  {
-    DrawConfirmButton(BUTTON_CONFIRM, DB_INIT);
-  }
-  else if (req_state & REQ_PLAYER)
-  {
-    DrawPlayerButton(BUTTON_PLAYER_1, DB_INIT);
-    DrawPlayerButton(BUTTON_PLAYER_2, DB_INIT);
-    DrawPlayerButton(BUTTON_PLAYER_3, DB_INIT);
-    DrawPlayerButton(BUTTON_PLAYER_4, DB_INIT);
-  }
-#else
-
   if (req_state & REQ_ASK)
   {
     MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
@@ -1924,8 +1915,6 @@ boolean Request(char *text, unsigned int req_state)
            DX, DY, DXSIZE, DYSIZE,
            DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
-#endif
-
   OpenDoor(DOOR_OPEN_1);
   ClearEventQueue();
 
@@ -1953,11 +1942,6 @@ boolean Request(char *text, unsigned int req_state)
        case ButtonRelease:
        case MotionNotify:
        {
-
-#if 0
-         int choice;
-#endif
-
          if (event.type == MotionNotify)
          {
            Window root, child;
@@ -1987,46 +1971,6 @@ boolean Request(char *text, unsigned int req_state)
              button_status = MB_RELEASED;
          }
 
-
-
-#if 0
-         if (req_state & REQ_ASK)
-           choice = CheckYesNoButtons(mx,my,button_status);
-         else if (req_state & REQ_CONFIRM)
-           choice = CheckConfirmButton(mx,my,button_status);
-         else
-           choice = CheckPlayerButtons(mx,my,button_status);
-
-         switch(choice)
-         {
-           case BUTTON_OK:
-             result = TRUE;
-             break;
-           case BUTTON_NO:
-             result = FALSE;
-             break;
-           case BUTTON_CONFIRM:
-             result = TRUE | FALSE;
-             break;
-
-           case BUTTON_PLAYER_1:
-             result = 1;
-             break;
-           case BUTTON_PLAYER_2:
-             result = 2;
-             break;
-           case BUTTON_PLAYER_3:
-             result = 3;
-             break;
-           case BUTTON_PLAYER_4:
-             result = 4;
-             break;
-
-           default:
-             break;
-         }
-#else
-
          /* this sets 'request_gadget_id' */
          HandleGadgets(mx, my, button_status);
 
@@ -2058,7 +2002,6 @@ boolean Request(char *text, unsigned int req_state)
            default:
              break;
          }
-#endif
 
          break;
        }
@@ -2730,6 +2673,22 @@ int el2gfx(int element)
       /* ^^^^^^^^^^ non-standard position in supaplex graphic set! */
     case EL_INVISIBLE_STEEL:   return GFX_INVISIBLE_STEEL;
     case EL_BLACK_ORB:         return GFX_BLACK_ORB;
+    case EL_EM_GATE_1:         return GFX_EM_GATE_1;
+    case EL_EM_GATE_2:         return GFX_EM_GATE_2;
+    case EL_EM_GATE_3:         return GFX_EM_GATE_3;
+    case EL_EM_GATE_4:         return GFX_EM_GATE_4;
+    case EL_EM_GATE_1X:                return GFX_EM_GATE_1X;
+    case EL_EM_GATE_2X:                return GFX_EM_GATE_2X;
+    case EL_EM_GATE_3X:                return GFX_EM_GATE_3X;
+    case EL_EM_GATE_4X:                return GFX_EM_GATE_4X;
+    case EL_EM_KEY_1_FILE:     return GFX_EM_KEY_1;
+    case EL_EM_KEY_2_FILE:     return GFX_EM_KEY_2;
+    case EL_EM_KEY_3_FILE:     return GFX_EM_KEY_3;
+    case EL_EM_KEY_4_FILE:     return GFX_EM_KEY_4;
+    case EL_EM_KEY_1:          return GFX_EM_KEY_1;
+    case EL_EM_KEY_2:          return GFX_EM_KEY_2;
+    case EL_EM_KEY_3:          return GFX_EM_KEY_3;
+    case EL_EM_KEY_4:          return GFX_EM_KEY_4;
 
     default:
     {