rnd-19991017-1-src
[rocksndiamonds.git] / src / tools.c
index d73c1d8900fa62c3b2dfe276c3aa8e919541271f..dbd8c5d5b9c567b5e5aca73c7f45c521b8fa4631 100644 (file)
@@ -586,6 +586,8 @@ void DrawPlayer(struct PlayerInfo *player)
        graphic = GFX_MURPHY_GO_LEFT;
       else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT)
        graphic = GFX_MURPHY_GO_RIGHT;
+      else
+       graphic = GFX_MURPHY_GO_LEFT;
 
       graphic += getGraphicAnimationPhase(3, 2, ANIM_OSCILLATE);
     }
@@ -645,7 +647,9 @@ void DrawPlayer(struct PlayerInfo *player)
       int element = Feld[next_jx][next_jy];
       int graphic = el2gfx(element);
 
-      if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK) && sxx)
+      if ((element == EL_FELSBROCKEN ||
+          element == EL_SP_ZONK ||
+          element == EL_BD_ROCK) && sxx)
       {
        int phase = (player->GfxPos / (TILEX / 4));
 
@@ -801,6 +805,13 @@ void getGraphicSource(int graphic, int *pixmap_nr, int *x, int *y)
     *x = (graphic % DC_PER_LINE) * TILEX;
     *y = (graphic / DC_PER_LINE) * TILEY;
   }
+  else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE)
+  {
+    graphic -= GFX_START_ROCKSMORE;
+    *pixmap_nr = PIX_MORE;
+    *x = (graphic % MORE_PER_LINE) * TILEX;
+    *y = (graphic / MORE_PER_LINE) * TILEY;
+  }
   else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT)
   {
     graphic -= GFX_START_ROCKSFONT;
@@ -921,6 +932,13 @@ void getMiniGraphicSource(int graphic, Pixmap *pixmap, int *x, int *y)
     *x = MINI_DC_STARTX + (graphic % MINI_DC_PER_LINE) * MINI_TILEX;
     *y = MINI_DC_STARTY + (graphic / MINI_DC_PER_LINE) * MINI_TILEY;
   }
+  else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE)
+  {
+    graphic -= GFX_START_ROCKSMORE;
+    *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;
+  }
   else if (graphic >= GFX_START_ROCKSFONT && graphic <= GFX_END_ROCKSFONT)
   {
     graphic -= GFX_START_ROCKSFONT;
@@ -1152,12 +1170,20 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
   {
     graphic += !phase2;
   }
-  else if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK ||
+  else if (element == EL_BALLOON)
+  {
+    graphic += phase4;
+  }
+  else if ((element == EL_FELSBROCKEN ||
+           element == EL_SP_ZONK ||
+           element == EL_BD_ROCK ||
            IS_GEM(element)) && !cut_mode)
   {
     if (uy >= lev_fieldy-1 || !IS_BELT(Feld[ux][uy+1]))
     {
-      if (element == EL_FELSBROCKEN || element == EL_SP_ZONK)
+      if (element == EL_FELSBROCKEN ||
+         element == EL_SP_ZONK ||
+         element == EL_BD_ROCK)
       {
        if (dir == MV_LEFT)
          graphic += (4 - phase4) % 4;
@@ -1267,7 +1293,10 @@ void ErdreichAnbroeckeln(int x, int y)
 
   element = Feld[ux][uy];
 
-  if (element == EL_ERDREICH || element == EL_LANDMINE)
+  if (element == EL_ERDREICH ||
+      element == EL_LANDMINE ||
+      element == EL_TRAP_INACTIVE ||
+      element == EL_TRAP_ACTIVE)
   {
     if (!IN_SCR_FIELD(x, y))
       return;
@@ -1285,7 +1314,10 @@ void ErdreichAnbroeckeln(int x, int y)
       else
        element = Feld[uxx][uyy];
 
-      if (element == EL_ERDREICH || element == EL_LANDMINE)
+      if (element == EL_ERDREICH ||
+         element == EL_LANDMINE ||
+         element == EL_TRAP_INACTIVE ||
+         element == EL_TRAP_ACTIVE)
        continue;
 
       if (i == 1 || i == 2)
@@ -1325,7 +1357,10 @@ void ErdreichAnbroeckeln(int x, int y)
       uyy = uy + xy[i][1];
 
       if (!IN_LEV_FIELD(uxx, uyy) ||
-         (Feld[uxx][uyy] != EL_ERDREICH && Feld[uxx][uyy] != EL_LANDMINE) ||
+         (Feld[uxx][uyy] != EL_ERDREICH &&
+          Feld[uxx][uyy] != EL_LANDMINE &&
+          Feld[uxx][uyy] != EL_TRAP_INACTIVE &&
+          Feld[uxx][uyy] != EL_TRAP_ACTIVE) ||
          !IN_SCR_FIELD(xx, yy))
        continue;
 
@@ -1541,6 +1576,14 @@ void DrawMicroElement(int xpos, int ypos, int element)
              MICRO_DC_STARTY + (graphic / MICRO_DC_PER_LINE) * MICRO_TILEY,
              MICRO_TILEX, MICRO_TILEY, xpos, ypos);
   }
+  else if (graphic >= GFX_START_ROCKSMORE && graphic <= GFX_END_ROCKSMORE)
+  {
+    graphic -= GFX_START_ROCKSMORE;
+    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,
+             MICRO_TILEX, MICRO_TILEY, xpos, ypos);
+  }
   else
     XCopyArea(display, pix[PIX_BACK], drawto, gc,
              MICRO_GFX_STARTX + (graphic % MICRO_GFX_PER_LINE) * MICRO_TILEX,
@@ -1626,7 +1669,7 @@ static void DrawMicroLevelLabelExt(int mode)
                       mode == MICROLABEL_LEVEL_AUTHOR ? level.author :
                       mode == MICROLABEL_IMPORTED_FROM ? "imported from" :
                       mode == MICROLABEL_LEVEL_IMPORT_INFO ?
-                      leveldir[leveldir_nr].imported_from : ""),
+                      leveldir_current->imported_from : ""),
          MAX_MICROLABEL_SIZE);
   label_text[MAX_MICROLABEL_SIZE] = '\0';
 
@@ -1709,12 +1752,12 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
   /* redraw micro level label, if needed */
   if (strcmp(level.name, NAMELESS_LEVEL_NAME) != 0 &&
       strcmp(level.author, ANONYMOUS_NAME) != 0 &&
-      strcmp(level.author, leveldir[leveldir_nr].name) != 0 &&
+      strcmp(level.author, leveldir_current->name) != 0 &&
       DelayReached(&label_delay, MICROLEVEL_LABEL_DELAY))
   {
     int max_label_counter = 23;
 
-    if (leveldir[leveldir_nr].imported_from != NULL)
+    if (leveldir_current->imported_from != NULL)
       max_label_counter += 14;
 
     label_counter = (label_counter + 1) % max_label_counter;
@@ -2603,6 +2646,24 @@ int el2gfx(int element)
     case EL_EMC_WALL_6:                return GFX_EMC_WALL_6;
     case EL_EMC_WALL_7:                return GFX_EMC_WALL_7;
     case EL_EMC_WALL_8:                return GFX_EMC_WALL_8;
+    case EL_TUBE_CROSS:                return GFX_TUBE_CROSS;
+    case EL_TUBE_VERTICAL:     return GFX_TUBE_VERTICAL;
+    case EL_TUBE_HORIZONTAL:   return GFX_TUBE_HORIZONTAL;
+    case EL_TUBE_VERT_LEFT:    return GFX_TUBE_VERT_LEFT;
+    case EL_TUBE_VERT_RIGHT:   return GFX_TUBE_VERT_RIGHT;
+    case EL_TUBE_HORIZ_UP:     return GFX_TUBE_HORIZ_UP;
+    case EL_TUBE_HORIZ_DOWN:   return GFX_TUBE_HORIZ_DOWN;
+    case EL_TUBE_LEFT_UP:      return GFX_TUBE_LEFT_UP;
+    case EL_TUBE_LEFT_DOWN:    return GFX_TUBE_LEFT_DOWN;
+    case EL_TUBE_RIGHT_UP:     return GFX_TUBE_RIGHT_UP;
+    case EL_TUBE_RIGHT_DOWN:   return GFX_TUBE_RIGHT_DOWN;
+    case EL_SPRING:            return GFX_SPRING;
+    case EL_SPRING_MOVING:     return GFX_SPRING;
+    case EL_TRAP_INACTIVE:     return GFX_TRAP_INACTIVE;
+    case EL_TRAP_ACTIVE:       return GFX_TRAP_ACTIVE;
+    case EL_BD_WALL:           return GFX_BD_WALL;
+    case EL_BD_ROCK:           return GFX_BD_ROCK;
+    case EL_DX_SUPABOMB:       return GFX_DX_SUPABOMB;
 
     default:
     {