rnd-20000718-1-src
[rocksndiamonds.git] / src / tools.c
index b9c4a826f90bf4c8c33b5d07fdeb95a67a9cf29a..0c9cd1766e69264bcacc83ed69a7f278ac7d9e96 100644 (file)
@@ -44,6 +44,8 @@ extern boolean wait_for_vsync;
 
 /* forward declaration for internal use */
 static int getGraphicAnimationPhase(int, int, int);
+static void DrawGraphicAnimationShiftedThruMask(int, int, int, int, int,
+                                               int, int, int);
 static void UnmapToolButtons();
 static void HandleToolButtons(struct GadgetInfo *);
 
@@ -317,6 +319,7 @@ void ClearWindow()
 int getFontWidth(int font_size, int font_type)
 {
   return (font_size == FS_BIG ? FONT1_XSIZE :
+         font_size == FS_MEDIUM ? FONT6_XSIZE :
          font_type == FC_SPECIAL1 ? FONT3_XSIZE :
          font_type == FC_SPECIAL2 ? FONT4_XSIZE :
          font_type == FC_SPECIAL3 ? FONT5_XSIZE :
@@ -326,12 +329,34 @@ int getFontWidth(int font_size, int font_type)
 int getFontHeight(int font_size, int font_type)
 {
   return (font_size == FS_BIG ? FONT1_YSIZE :
+         font_size == FS_MEDIUM ? FONT6_YSIZE :
          font_type == FC_SPECIAL1 ? FONT3_YSIZE :
          font_type == FC_SPECIAL2 ? FONT4_YSIZE :
          font_type == FC_SPECIAL3 ? FONT5_YSIZE :
          FONT2_YSIZE);
 }
 
+void DrawInitText(char *text, int ypos, int color)
+{
+#ifdef USE_SDL_LIBRARY
+  if (sdl_window && sdl_pix[PIX_SMALLFONT])
+  {
+    SDLFillRectangle(sdl_window, 0, ypos, WIN_XSIZE, FONT2_YSIZE, 0x000000);
+    DrawTextExt(window, gc, (WIN_XSIZE - strlen(text) * FONT2_XSIZE)/2,
+               ypos,text,FS_SMALL,color);
+    SDL_Flip(sdl_window);
+  }
+#else
+  if (display && window && pix[PIX_SMALLFONT])
+  {
+    XFillRectangle(display, window, gc, 0, ypos, WIN_XSIZE, FONT2_YSIZE);
+    DrawTextExt(window, gc, (WIN_XSIZE - strlen(text) * FONT2_XSIZE)/2,
+               ypos,text,FS_SMALL,color);
+    XFlush(display);
+  }
+#endif
+}
+
 void DrawTextFCentered(int y, int font_type, char *format, ...)
 {
   char buffer[FULL_SXSIZE / FONT5_XSIZE + 10];
@@ -375,7 +400,7 @@ void DrawTextExt(Drawable d, GC gc, int x, int y,
   int font_pixmap;
   boolean print_inverse = FALSE;
 
-  if (font_size != FS_SMALL && font_size != FS_BIG)
+  if (font_size != FS_SMALL && font_size != FS_BIG && font_size != FS_MEDIUM)
     font_size = FS_SMALL;
   if (font_type < FC_RED || font_type > FC_SPECIAL3)
     font_type = FC_RED;
@@ -383,8 +408,12 @@ void DrawTextExt(Drawable d, GC gc, int x, int y,
   font_width = getFontWidth(font_size, font_type);
   font_height = getFontHeight(font_size, font_type);
 
-  font_pixmap = (font_size == FS_BIG ? PIX_BIGFONT : PIX_SMALLFONT);
-  font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE : FONT2_YSIZE) *
+  font_pixmap = (font_size == FS_BIG ? PIX_BIGFONT :
+                font_size == FS_MEDIUM ? PIX_MEDIUMFONT :
+                PIX_SMALLFONT);
+  font_start = (font_type * (font_size == FS_BIG ? FONT1_YSIZE :
+                            font_size == FS_MEDIUM ? FONT6_YSIZE :
+                            FONT2_YSIZE) *
                FONT_LINES_PER_FONT);
 
   if (font_type == FC_SPECIAL3)
@@ -428,8 +457,15 @@ void DrawTextExt(Drawable d, GC gc, int x, int y,
                  0, 0, font_width, font_height, dest_x, dest_y);
       }
       else
+      {
+#ifdef USE_SDL_LIBRARY
+       SDLCopyArea(sdl_pix[font_pixmap], sdl_window,
+                   src_x, src_y, font_width, font_height, dest_x, dest_y);
+#else
        XCopyArea(display, pix[font_pixmap], d, gc,
                  src_x, src_y, font_width, font_height, dest_x, dest_y);
+#endif
+      }
     }
 
     x += font_width;
@@ -567,6 +603,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);
     }
@@ -604,6 +642,15 @@ void DrawPlayer(struct PlayerInfo *player)
 
   DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, NO_CUTTING);
 
+  if (SHIELD_ON(player))
+  {
+    int graphic = (player->shield_active_time_left ? GFX2_SHIELD_ACTIVE :
+                  GFX2_SHIELD_PASSIVE);
+
+    DrawGraphicAnimationShiftedThruMask(sx, sy, sxx, syy, graphic,
+                                       3, 8, ANIM_OSCILLATE);
+  }
+
   if (player->Pushing && player->GfxPos)
   {
     int px = SCREENX(next_jx), py = SCREENY(next_jy);
@@ -617,7 +664,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));
 
@@ -732,6 +781,17 @@ void DrawGraphicAnimationThruMask(int x, int y, int graphic,
   DrawGraphicAnimationExt(x, y, graphic, frames, delay, mode, USE_MASKING);
 }
 
+static void DrawGraphicAnimationShiftedThruMask(int sx, int sy,
+                                               int sxx, int syy,
+                                               int graphic,
+                                               int frames, int delay,
+                                               int mode)
+{
+  int phase = getGraphicAnimationPhase(frames, delay, mode);
+
+  DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic + phase, NO_CUTTING);
+}
+
 void getGraphicSource(int graphic, int *pixmap_nr, int *x, int *y)
 {
   if (graphic >= GFX_START_ROCKSSCREEN && graphic <= GFX_END_ROCKSSCREEN)
@@ -762,6 +822,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;
@@ -882,6 +949,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;
@@ -1079,23 +1153,23 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
   {
     graphic = GFX2_SP_ELECTRON + getGraphicAnimationPhase(8, 2, ANIM_NORMAL);
   }
-  else if (element == EL_MAULWURF || element == EL_PINGUIN ||
+  else if (element == EL_MOLE || element == EL_PINGUIN ||
           element == EL_SCHWEIN || element == EL_DRACHE)
   {
     if (dir == MV_LEFT)
-      graphic = (element == EL_MAULWURF ? GFX_MAULWURF_LEFT :
+      graphic = (element == EL_MOLE ? GFX_MOLE_LEFT :
                 element == EL_PINGUIN ? GFX_PINGUIN_LEFT :
                 element == EL_SCHWEIN ? GFX_SCHWEIN_LEFT : GFX_DRACHE_LEFT);
     else if (dir == MV_RIGHT)
-      graphic = (element == EL_MAULWURF ? GFX_MAULWURF_RIGHT :
+      graphic = (element == EL_MOLE ? GFX_MOLE_RIGHT :
                 element == EL_PINGUIN ? GFX_PINGUIN_RIGHT :
                 element == EL_SCHWEIN ? GFX_SCHWEIN_RIGHT : GFX_DRACHE_RIGHT);
     else if (dir == MV_UP)
-      graphic = (element == EL_MAULWURF ? GFX_MAULWURF_UP :
+      graphic = (element == EL_MOLE ? GFX_MOLE_UP :
                 element == EL_PINGUIN ? GFX_PINGUIN_UP :
                 element == EL_SCHWEIN ? GFX_SCHWEIN_UP : GFX_DRACHE_UP);
     else
-      graphic = (element == EL_MAULWURF ? GFX_MAULWURF_DOWN :
+      graphic = (element == EL_MOLE ? GFX_MOLE_DOWN :
                 element == EL_PINGUIN ? GFX_PINGUIN_DOWN :
                 element == EL_SCHWEIN ? GFX_SCHWEIN_DOWN : GFX_DRACHE_DOWN);
 
@@ -1113,23 +1187,36 @@ 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 (element == EL_FELSBROCKEN || element == EL_SP_ZONK)
+    if (uy >= lev_fieldy-1 || !IS_BELT(Feld[ux][uy+1]))
     {
-      if (dir == MV_LEFT)
-       graphic += (4 - phase4) % 4;
-      else if (dir == MV_RIGHT)
-       graphic += phase4;
-      else
-       graphic += phase2 * 2;
+      if (element == EL_FELSBROCKEN ||
+         element == EL_SP_ZONK ||
+         element == EL_BD_ROCK)
+      {
+       if (dir == MV_LEFT)
+         graphic += (4 - phase4) % 4;
+       else if (dir == MV_RIGHT)
+         graphic += phase4;
+       else
+         graphic += phase2 * 2;
+      }
+      else if (element != EL_SP_INFOTRON)
+       graphic += phase2;
     }
-    else if (element != EL_SP_INFOTRON)
-      graphic += phase2;
   }
-  else if (element == EL_SIEB_LEER || element == EL_SIEB2_LEER ||
-          element == EL_SIEB_VOLL || element == EL_SIEB2_VOLL)
+  else if (element == EL_MAGIC_WALL_EMPTY ||
+          element == EL_MAGIC_WALL_BD_EMPTY ||
+          element == EL_MAGIC_WALL_FULL ||
+          element == EL_MAGIC_WALL_BD_FULL)
   {
     graphic += 3 + getGraphicAnimationPhase(4, 4, ANIM_REVERSE);
   }
@@ -1154,6 +1241,14 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
     else if (rechts_massiv)
       graphic = GFX_MAUER_L;
   }
+  else if ((element == EL_INVISIBLE_STEEL ||
+           element == EL_UNSICHTBAR ||
+           element == EL_SAND_INVISIBLE) && game.light_time_left)
+  {
+    graphic = (element == EL_INVISIBLE_STEEL ? GFX_INVISIBLE_STEEL_ON :
+              element == EL_UNSICHTBAR ? GFX_UNSICHTBAR_ON :
+              GFX_SAND_INVISIBLE_ON);
+  }
 
   if (dx || dy)
     DrawGraphicShifted(x, y, dx, dy, graphic, cut_mode, mask_mode);
@@ -1217,7 +1312,10 @@ void ErdreichAnbroeckeln(int x, int y)
 
   element = Feld[ux][uy];
 
-  if (element == EL_ERDREICH)
+  if (element == EL_ERDREICH ||
+      element == EL_LANDMINE ||
+      element == EL_TRAP_INACTIVE ||
+      element == EL_TRAP_ACTIVE)
   {
     if (!IN_SCR_FIELD(x, y))
       return;
@@ -1235,7 +1333,10 @@ void ErdreichAnbroeckeln(int x, int y)
       else
        element = Feld[uxx][uyy];
 
-      if (element == EL_ERDREICH)
+      if (element == EL_ERDREICH ||
+         element == EL_LANDMINE ||
+         element == EL_TRAP_INACTIVE ||
+         element == EL_TRAP_ACTIVE)
        continue;
 
       if (i == 1 || i == 2)
@@ -1274,7 +1375,11 @@ void ErdreichAnbroeckeln(int x, int y)
       uxx = ux + xy[i][0];
       uyy = uy + xy[i][1];
 
-      if (!IN_LEV_FIELD(uxx, uyy) || Feld[uxx][uyy] != EL_ERDREICH ||
+      if (!IN_LEV_FIELD(uxx, uyy) ||
+         (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;
 
@@ -1339,13 +1444,13 @@ void DrawScreenField(int x, int y)
     boolean cut_mode = NO_CUTTING;
 
     if (Store[ux][uy] == EL_MORAST_LEER ||
-       Store[ux][uy] == EL_SIEB_LEER ||
-       Store[ux][uy] == EL_SIEB2_LEER ||
+       Store[ux][uy] == EL_MAGIC_WALL_EMPTY ||
+       Store[ux][uy] == EL_MAGIC_WALL_BD_EMPTY ||
        Store[ux][uy] == EL_AMOEBE_NASS)
       cut_mode = CUT_ABOVE;
     else if (Store[ux][uy] == EL_MORAST_VOLL ||
-            Store[ux][uy] == EL_SIEB_VOLL ||
-            Store[ux][uy] == EL_SIEB2_VOLL)
+            Store[ux][uy] == EL_MAGIC_WALL_FULL ||
+            Store[ux][uy] == EL_MAGIC_WALL_BD_FULL)
       cut_mode = CUT_BELOW;
 
     if (cut_mode == CUT_ABOVE)
@@ -1375,8 +1480,8 @@ void DrawScreenField(int x, int y)
                  MovDir[oldx][oldy] == MV_RIGHT);
 
     if (Store[oldx][oldy] == EL_MORAST_LEER ||
-       Store[oldx][oldy] == EL_SIEB_LEER ||
-       Store[oldx][oldy] == EL_SIEB2_LEER ||
+       Store[oldx][oldy] == EL_MAGIC_WALL_EMPTY ||
+       Store[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTY ||
        Store[oldx][oldy] == EL_AMOEBE_NASS)
       cut_mode = CUT_ABOVE;
 
@@ -1478,17 +1583,24 @@ void DrawMicroElement(int xpos, int ypos, int element)
     graphic -= GFX_START_ROCKSSP;
     graphic -= ((graphic / SP_PER_LINE) * SP_PER_LINE) / 2;
     XCopyArea(display, pix[PIX_SP], drawto, gc,
-             MICRO_SP_STARTX + (graphic % MICRO_SP_PER_LINE) *MICRO_TILEX,
-             MICRO_SP_STARTY + (graphic / MICRO_SP_PER_LINE) *MICRO_TILEY,
+             MICRO_SP_STARTX + (graphic % MICRO_SP_PER_LINE) * MICRO_TILEX,
+             MICRO_SP_STARTY + (graphic / MICRO_SP_PER_LINE) * MICRO_TILEY,
              MICRO_TILEX, MICRO_TILEY, xpos, ypos);
   }
   else if (graphic >= GFX_START_ROCKSDC && graphic <= GFX_END_ROCKSDC)
   {
     graphic -= GFX_START_ROCKSDC;
-    graphic -= ((graphic / DC_PER_LINE) * DC_PER_LINE) / 2;
     XCopyArea(display, pix[PIX_DC], drawto, gc,
-             MICRO_DC_STARTX + (graphic % MICRO_DC_PER_LINE) *MICRO_TILEX,
-             MICRO_DC_STARTY + (graphic / MICRO_DC_PER_LINE) *MICRO_TILEY,
+             MICRO_DC_STARTX + (graphic % MICRO_DC_PER_LINE) * MICRO_TILEX,
+             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
@@ -1576,7 +1688,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';
 
@@ -1659,12 +1771,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;
@@ -2335,25 +2447,25 @@ int el2gfx(int element)
     case EL_SPIELER3:          return GFX_SPIELER3;
     case EL_SPIELER4:          return GFX_SPIELER4;
     case EL_KAEFER:            return GFX_KAEFER;
-    case EL_KAEFER_R:          return GFX_KAEFER_R;
-    case EL_KAEFER_O:          return GFX_KAEFER_O;
-    case EL_KAEFER_L:          return GFX_KAEFER_L;
-    case EL_KAEFER_U:          return GFX_KAEFER_U;
+    case EL_KAEFER_RIGHT:      return GFX_KAEFER_RIGHT;
+    case EL_KAEFER_UP:         return GFX_KAEFER_UP;
+    case EL_KAEFER_LEFT:       return GFX_KAEFER_LEFT;
+    case EL_KAEFER_DOWN:       return GFX_KAEFER_DOWN;
     case EL_FLIEGER:           return GFX_FLIEGER;
-    case EL_FLIEGER_R:         return GFX_FLIEGER_R;
-    case EL_FLIEGER_O:         return GFX_FLIEGER_O;
-    case EL_FLIEGER_L:         return GFX_FLIEGER_L;
-    case EL_FLIEGER_U:         return GFX_FLIEGER_U;
+    case EL_FLIEGER_RIGHT:     return GFX_FLIEGER_RIGHT;
+    case EL_FLIEGER_UP:                return GFX_FLIEGER_UP;
+    case EL_FLIEGER_LEFT:      return GFX_FLIEGER_LEFT;
+    case EL_FLIEGER_DOWN:      return GFX_FLIEGER_DOWN;
     case EL_BUTTERFLY:         return GFX_BUTTERFLY;
-    case EL_BUTTERFLY_R:       return GFX_BUTTERFLY_R;
-    case EL_BUTTERFLY_O:       return GFX_BUTTERFLY_O;
-    case EL_BUTTERFLY_L:       return GFX_BUTTERFLY_L;
-    case EL_BUTTERFLY_U:       return GFX_BUTTERFLY_U;
+    case EL_BUTTERFLY_RIGHT:   return GFX_BUTTERFLY_RIGHT;
+    case EL_BUTTERFLY_UP:      return GFX_BUTTERFLY_UP;
+    case EL_BUTTERFLY_LEFT:    return GFX_BUTTERFLY_LEFT;
+    case EL_BUTTERFLY_DOWN:    return GFX_BUTTERFLY_DOWN;
     case EL_FIREFLY:           return GFX_FIREFLY;
-    case EL_FIREFLY_R:         return GFX_FIREFLY_R;
-    case EL_FIREFLY_O:         return GFX_FIREFLY_O;
-    case EL_FIREFLY_L:         return GFX_FIREFLY_L;
-    case EL_FIREFLY_U:         return GFX_FIREFLY_U;
+    case EL_FIREFLY_RIGHT:     return GFX_FIREFLY_RIGHT;
+    case EL_FIREFLY_UP:                return GFX_FIREFLY_UP;
+    case EL_FIREFLY_LEFT:      return GFX_FIREFLY_LEFT;
+    case EL_FIREFLY_DOWN:      return GFX_FIREFLY_DOWN;
     case EL_MAMPFER:           return GFX_MAMPFER;
     case EL_ROBOT:             return GFX_ROBOT;
     case EL_BETON:             return GFX_BETON;
@@ -2362,10 +2474,10 @@ int el2gfx(int element)
     case EL_MORAST_VOLL:       return GFX_MORAST_VOLL;
     case EL_TROPFEN:           return GFX_TROPFEN;
     case EL_BOMBE:             return GFX_BOMBE;
-    case EL_SIEB_INAKTIV:      return GFX_SIEB_INAKTIV;
-    case EL_SIEB_LEER:         return GFX_SIEB_LEER;
-    case EL_SIEB_VOLL:         return GFX_SIEB_VOLL;
-    case EL_SIEB_TOT:          return GFX_SIEB_TOT;
+    case EL_MAGIC_WALL_OFF:    return GFX_MAGIC_WALL_OFF;
+    case EL_MAGIC_WALL_EMPTY:  return GFX_MAGIC_WALL_EMPTY;
+    case EL_MAGIC_WALL_FULL:   return GFX_MAGIC_WALL_FULL;
+    case EL_MAGIC_WALL_DEAD:   return GFX_MAGIC_WALL_DEAD;
     case EL_SALZSAEURE:                return GFX_SALZSAEURE;
     case EL_AMOEBE_TOT:                return GFX_AMOEBE_TOT;
     case EL_AMOEBE_NASS:       return GFX_AMOEBE_NASS;
@@ -2399,10 +2511,10 @@ int el2gfx(int element)
     case EL_PFORTE4X:          return GFX_PFORTE4X;
     case EL_DYNAMITE_INACTIVE: return GFX_DYNAMIT_AUS;
     case EL_PACMAN:            return GFX_PACMAN;
-    case EL_PACMAN_R:          return GFX_PACMAN_R;
-    case EL_PACMAN_O:          return GFX_PACMAN_O;
-    case EL_PACMAN_L:          return GFX_PACMAN_L;
-    case EL_PACMAN_U:          return GFX_PACMAN_U;
+    case EL_PACMAN_RIGHT:      return GFX_PACMAN_RIGHT;
+    case EL_PACMAN_UP:         return GFX_PACMAN_UP;
+    case EL_PACMAN_LEFT:       return GFX_PACMAN_LEFT;
+    case EL_PACMAN_DOWN:       return GFX_PACMAN_DOWN;
     case EL_UNSICHTBAR:                return GFX_UNSICHTBAR;
     case EL_ERZ_EDEL:          return GFX_ERZ_EDEL;
     case EL_ERZ_DIAM:          return GFX_ERZ_DIAM;
@@ -2423,10 +2535,10 @@ int el2gfx(int element)
     case EL_ERZ_EDEL_ROT:      return GFX_ERZ_EDEL_ROT;
     case EL_ERZ_EDEL_LILA:     return GFX_ERZ_EDEL_LILA;
     case EL_MAMPFER2:          return GFX_MAMPFER2;
-    case EL_SIEB2_INAKTIV:     return GFX_SIEB2_INAKTIV;
-    case EL_SIEB2_LEER:                return GFX_SIEB2_LEER;
-    case EL_SIEB2_VOLL:                return GFX_SIEB2_VOLL;
-    case EL_SIEB2_TOT:         return GFX_SIEB2_TOT;
+    case EL_MAGIC_WALL_BD_OFF: return GFX_MAGIC_WALL_BD_OFF;
+    case EL_MAGIC_WALL_BD_EMPTY:return GFX_MAGIC_WALL_BD_EMPTY;
+    case EL_MAGIC_WALL_BD_FULL:        return GFX_MAGIC_WALL_BD_FULL;
+    case EL_MAGIC_WALL_BD_DEAD:        return GFX_MAGIC_WALL_BD_DEAD;
     case EL_DYNABOMB_ACTIVE_1: return GFX_DYNABOMB;
     case EL_DYNABOMB_ACTIVE_2: return GFX_DYNABOMB;
     case EL_DYNABOMB_ACTIVE_3: return GFX_DYNABOMB;
@@ -2437,15 +2549,15 @@ int el2gfx(int element)
     case EL_SOKOBAN_OBJEKT:    return GFX_SOKOBAN_OBJEKT;
     case EL_SOKOBAN_FELD_LEER: return GFX_SOKOBAN_FELD_LEER;
     case EL_SOKOBAN_FELD_VOLL: return GFX_SOKOBAN_FELD_VOLL;
-    case EL_MAULWURF:          return GFX_MAULWURF;
+    case EL_MOLE:              return GFX_MOLE;
     case EL_PINGUIN:           return GFX_PINGUIN;
     case EL_SCHWEIN:           return GFX_SCHWEIN;
     case EL_DRACHE:            return GFX_DRACHE;
     case EL_SONDE:             return GFX_SONDE;
-    case EL_PFEIL_L:           return GFX_PFEIL_L;
-    case EL_PFEIL_R:           return GFX_PFEIL_R;
-    case EL_PFEIL_O:           return GFX_PFEIL_O;
-    case EL_PFEIL_U:           return GFX_PFEIL_U;
+    case EL_PFEIL_LEFT:                return GFX_PFEIL_LEFT;
+    case EL_PFEIL_RIGHT:       return GFX_PFEIL_RIGHT;
+    case EL_PFEIL_UP:          return GFX_PFEIL_UP;
+    case EL_PFEIL_DOWN:                return GFX_PFEIL_DOWN;
     case EL_SPEED_PILL:                return GFX_SPEED_PILL;
     case EL_SP_TERMINAL_ACTIVE:        return GFX_SP_TERMINAL;
     case EL_SP_BUG_ACTIVE:     return GFX_SP_BUG_ACTIVE;
@@ -2476,41 +2588,41 @@ int el2gfx(int element)
     case EL_DOOR_WHITE:                return GFX_DOOR_WHITE;
     case EL_DOOR_WHITE_GRAY:   return GFX_DOOR_WHITE_GRAY;
     case EL_KEY_WHITE:         return GFX_KEY_WHITE;
-    case EL_FORCE_FIELD:       return GFX_FORCE_FIELD;
+    case EL_SHIELD_PASSIVE:    return GFX_SHIELD_PASSIVE;
+    case EL_SHIELD_ACTIVE:     return GFX_SHIELD_ACTIVE;
     case EL_EXTRA_TIME:                return GFX_EXTRA_TIME;
     case EL_SWITCHGATE_OPEN:   return GFX_SWITCHGATE_OPEN;
     case EL_SWITCHGATE_CLOSED: return GFX_SWITCHGATE_CLOSED;
-    case EL_SWITCHGATE_SWITCH_L:return GFX_SWITCHGATE_SWITCH_L;
-    case EL_SWITCHGATE_SWITCH_R:return GFX_SWITCHGATE_SWITCH_R;
-    case EL_TIME_GATE:         return GFX_TIME_GATE;
-    case EL_TIME_GATE_WHEEL:   return GFX_TIME_GATE_WHEEL;
+    case EL_SWITCHGATE_SWITCH_1:return GFX_SWITCHGATE_SWITCH_1;
+    case EL_SWITCHGATE_SWITCH_2:return GFX_SWITCHGATE_SWITCH_2;
     case EL_BELT1_LEFT:                return GFX_BELT1_LEFT;
     case EL_BELT1_MIDDLE:      return GFX_BELT1_MIDDLE;
     case EL_BELT1_RIGHT:       return GFX_BELT1_RIGHT;
-    case EL_BELT1_SWITCH_L:    return GFX_BELT1_SWITCH_L;
-    case EL_BELT1_SWITCH_M:    return GFX_BELT1_SWITCH_M;
-    case EL_BELT1_SWITCH_R:    return GFX_BELT1_SWITCH_R;
+    case EL_BELT1_SWITCH_LEFT: return GFX_BELT1_SWITCH_LEFT;
+    case EL_BELT1_SWITCH_MIDDLE:return GFX_BELT1_SWITCH_MIDDLE;
+    case EL_BELT1_SWITCH_RIGHT:        return GFX_BELT1_SWITCH_RIGHT;
     case EL_BELT2_LEFT:                return GFX_BELT2_LEFT;
     case EL_BELT2_MIDDLE:      return GFX_BELT2_MIDDLE;
     case EL_BELT2_RIGHT:       return GFX_BELT2_RIGHT;
-    case EL_BELT2_SWITCH_L:    return GFX_BELT2_SWITCH_L;
-    case EL_BELT2_SWITCH_M:    return GFX_BELT2_SWITCH_M;
-    case EL_BELT2_SWITCH_R:    return GFX_BELT2_SWITCH_R;
+    case EL_BELT2_SWITCH_LEFT: return GFX_BELT2_SWITCH_LEFT;
+    case EL_BELT2_SWITCH_MIDDLE:return GFX_BELT2_SWITCH_MIDDLE;
+    case EL_BELT2_SWITCH_RIGHT:        return GFX_BELT2_SWITCH_RIGHT;
     case EL_BELT3_LEFT:                return GFX_BELT3_LEFT;
     case EL_BELT3_MIDDLE:      return GFX_BELT3_MIDDLE;
     case EL_BELT3_RIGHT:       return GFX_BELT3_RIGHT;
-    case EL_BELT3_SWITCH_L:    return GFX_BELT3_SWITCH_L;
-    case EL_BELT3_SWITCH_M:    return GFX_BELT3_SWITCH_M;
-    case EL_BELT3_SWITCH_R:    return GFX_BELT3_SWITCH_R;
+    case EL_BELT3_SWITCH_LEFT: return GFX_BELT3_SWITCH_LEFT;
+    case EL_BELT3_SWITCH_MIDDLE:return GFX_BELT3_SWITCH_MIDDLE;
+    case EL_BELT3_SWITCH_RIGHT:        return GFX_BELT3_SWITCH_RIGHT;
     case EL_BELT4_LEFT:                return GFX_BELT4_LEFT;
     case EL_BELT4_MIDDLE:      return GFX_BELT4_MIDDLE;
     case EL_BELT4_RIGHT:       return GFX_BELT4_RIGHT;
-    case EL_BELT4_SWITCH_L:    return GFX_BELT4_SWITCH_L;
-    case EL_BELT4_SWITCH_M:    return GFX_BELT4_SWITCH_M;
-    case EL_BELT4_SWITCH_R:    return GFX_BELT4_SWITCH_R;
+    case EL_BELT4_SWITCH_LEFT: return GFX_BELT4_SWITCH_LEFT;
+    case EL_BELT4_SWITCH_MIDDLE:return GFX_BELT4_SWITCH_MIDDLE;
+    case EL_BELT4_SWITCH_RIGHT:        return GFX_BELT4_SWITCH_RIGHT;
     case EL_LANDMINE:          return GFX_LANDMINE;
     case EL_ENVELOPE:          return GFX_ENVELOPE;
-    case EL_LIGHT_SWITCH:      return GFX_LIGHT_SWITCH;
+    case EL_LIGHT_SWITCH_OFF:  return GFX_LIGHT_SWITCH_OFF;
+    case EL_LIGHT_SWITCH_ON:   return GFX_LIGHT_SWITCH_ON;
     case EL_SIGN_EXCLAMATION:  return GFX_SIGN_EXCLAMATION;
     case EL_SIGN_RADIOACTIVITY:        return GFX_SIGN_RADIOACTIVITY;
     case EL_SIGN_STOP:         return GFX_SIGN_STOP;
@@ -2529,6 +2641,49 @@ int el2gfx(int element)
     case EL_MOLE_DOWN:         return GFX_MOLE_DOWN;
     case EL_STEEL_SLANTED:     return GFX_STEEL_SLANTED;
     case EL_SAND_INVISIBLE:    return GFX_SAND_INVISIBLE;
+    case EL_DX_UNKNOWN_15:     return GFX_DX_UNKNOWN_15;
+    case EL_DX_UNKNOWN_42:     return GFX_DX_UNKNOWN_42;
+    case EL_TIMEGATE_OPEN:     return GFX_TIMEGATE_OPEN;
+    case EL_TIMEGATE_CLOSED:   return GFX_TIMEGATE_CLOSED;
+    case EL_TIMEGATE_SWITCH_ON:        return GFX_TIMEGATE_SWITCH;
+    case EL_TIMEGATE_SWITCH_OFF:return GFX_TIMEGATE_SWITCH;
+    case EL_BALLOON:           return GFX_BALLOON;
+    case EL_BALLOON_SEND_LEFT: return GFX_BALLOON_SEND_LEFT;
+    case EL_BALLOON_SEND_RIGHT:        return GFX_BALLOON_SEND_RIGHT;
+    case EL_BALLOON_SEND_UP:   return GFX_BALLOON_SEND_UP;
+    case EL_BALLOON_SEND_DOWN: return GFX_BALLOON_SEND_DOWN;
+    case EL_BALLOON_SEND_ANY:  return GFX_BALLOON_SEND_ANY;
+    case EL_EMC_STEEL_WALL_1:  return GFX_EMC_STEEL_WALL_1;
+    case EL_EMC_STEEL_WALL_2:  return GFX_EMC_STEEL_WALL_2;
+    case EL_EMC_STEEL_WALL_3:  return GFX_EMC_STEEL_WALL_3;
+    case EL_EMC_STEEL_WALL_4:  return GFX_EMC_STEEL_WALL_4;
+    case EL_EMC_WALL_1:                return GFX_EMC_WALL_1;
+    case EL_EMC_WALL_2:                return GFX_EMC_WALL_2;
+    case EL_EMC_WALL_3:                return GFX_EMC_WALL_3;
+    case EL_EMC_WALL_4:                return GFX_EMC_WALL_4;
+    case EL_EMC_WALL_5:                return GFX_EMC_WALL_5;
+    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;
+    case EL_SP_MURPHY_CLONE:   return GFX_SP_MURPHY_CLONE;
 
     default:
     {