rnd-20021005-1-src
[rocksndiamonds.git] / src / game.c
index 56cb38b2a363d17f719130ff276301cc5b8ef44f..203149bc4791bfff2bcd5e248d083e032d38d422 100644 (file)
@@ -1459,7 +1459,7 @@ void DrawDynamite(int x, int y)
 #else
   int graphic = el2img(Feld[x][y]);
 #endif
-  int phase;
+  int frame;
 
   if (!IN_SCR_FIELD(sx, sy) || IS_PLAYER(x, y))
     return;
@@ -1473,37 +1473,37 @@ void DrawDynamite(int x, int y)
 
   if (Feld[x][y] == EL_DYNAMITE_ACTIVE)
   {
-    if ((phase = (96 - MovDelay[x][y]) / 12) > 6)
-      phase = 6;
+    if ((frame = (96 - MovDelay[x][y]) / 12) > 6)
+      frame = 6;
   }
   else
   {
-    if ((phase = ((96 - MovDelay[x][y]) / 6) % 8) > 3)
-      phase = 7 - phase;
+    if ((frame = ((96 - MovDelay[x][y]) / 6) % 8) > 3)
+      frame = 7 - frame;
   }
 
 #if 1
-  phase = getNewGraphicAnimationFrame(graphic, 96 - MovDelay[x][y]);
+  frame = getNewGraphicAnimationFrame(graphic, 96 - MovDelay[x][y]);
 #endif
 
   /*
-  printf("-> %d: %d [%d]\n", graphic, phase, MovDelay[x][y]);
+  printf("-> %d: %d [%d]\n", graphic, frame, MovDelay[x][y]);
   */
 
 #if 0
   if (game.emulation == EMU_SUPAPLEX)
     DrawGraphic(sx, sy, GFX_SP_DISK_RED);
   else if (Store[x][y])
-    DrawGraphicThruMask(sx, sy, graphic + phase);
+    DrawGraphicThruMask(sx, sy, graphic + frame);
   else
-    DrawGraphic(sx, sy, graphic + phase);
+    DrawGraphic(sx, sy, graphic + frame);
 #else
   if (game.emulation == EMU_SUPAPLEX)
     DrawNewGraphic(sx, sy, IMG_SP_DISK_RED, 0);
   else if (Store[x][y])
-    DrawNewGraphicThruMask(sx, sy, graphic, phase);
+    DrawNewGraphicThruMask(sx, sy, graphic, frame);
   else
-    DrawNewGraphic(sx, sy, graphic, phase);
+    DrawNewGraphic(sx, sy, graphic, frame);
 #endif
 }
 
@@ -1540,7 +1540,8 @@ void CheckDynamite(int x, int y)
 void Explode(int ex, int ey, int phase, int mode)
 {
   int x, y;
-  int num_phase = 9, delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2);
+  int num_phase = 9;
+  int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2);
   int last_phase = num_phase * delay;
   int half_phase = (num_phase / 2) * delay;
   int first_phase_after_start = EX_PHASE_START + 1;
@@ -1724,13 +1725,14 @@ void Explode(int ex, int ey, int phase, int mode)
     InitField(x, y, FALSE);
     if (CAN_MOVE(element) || COULD_MOVE(element))
       InitMovDir(x, y);
-    DrawLevelField(x, y);
+    DrawNewLevelField(x, y);
 
     if (IS_PLAYER(x, y) && !PLAYERINFO(x,y)->present)
       StorePlayer[x][y] = 0;
   }
   else if (!(phase % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
   {
+#if 0
     int graphic = GFX_EXPLOSION;
 
     if (game.emulation == EMU_SUPAPLEX)
@@ -1738,18 +1740,35 @@ void Explode(int ex, int ey, int phase, int mode)
                 GFX_SP_EXPLODE_INFOTRON :
                 GFX_SP_EXPLODE_EMPTY);
 
+    graphic += (phase / delay - 1);
+#else
+    int graphic = IMG_EXPLOSION;
+    int frame = (phase / delay - 1);
+
+    if (game.emulation == EMU_SUPAPLEX)
+      graphic = (Store[x][y] == EL_SP_INFOTRON ?
+                IMG_SP_EXPLOSION_INFOTRON :
+                IMG_SP_EXPLOSION);
+#endif
+
     if (phase == delay)
       ErdreichAnbroeckeln(SCREENX(x), SCREENY(y));
 
-    graphic += (phase / delay - 1);
-
     if (IS_PFORTE(Store[x][y]))
     {
-      DrawLevelElement(x, y, Store[x][y]);
+      DrawNewLevelElement(x, y, Store[x][y]);
+#if 0
       DrawGraphicThruMask(SCREENX(x), SCREENY(y), graphic);
+#else
+      DrawNewGraphicThruMask(SCREENX(x), SCREENY(y), graphic, frame);
+#endif
     }
     else
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), graphic);
+#else
+      DrawNewGraphic(SCREENX(x), SCREENY(y), graphic, frame);
+#endif
   }
 }
 
@@ -1879,8 +1898,14 @@ void Blurb(int x, int y)
   }
   else                                                         /* go on */
   {
+#if 0
     int graphic =
       (element == EL_ACID_SPLASHING_LEFT ? GFX_BLURB_LEFT : GFX_BLURB_RIGHT);
+#else
+    int graphic = (element == EL_ACID_SPLASHING_LEFT ?
+                  IMG_ACID_SPLASHING_LEFT :
+                  IMG_ACID_SPLASHING_RIGHT);
+#endif
 
     if (!MovDelay[x][y])       /* initialize animation counter */
       MovDelay[x][y] = 9;
@@ -1889,12 +1914,20 @@ void Blurb(int x, int y)
     {
       MovDelay[x][y]--;
       if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
        DrawGraphic(SCREENX(x), SCREENY(y), graphic+4-MovDelay[x][y]/2);
+#else
+      {
+       int frame = getNewGraphicAnimationFrame(graphic, 8 - MovDelay[x][y]);
+
+        DrawNewGraphic(SCREENX(x), SCREENY(y), graphic, frame);
+      }
+#endif
 
       if (!MovDelay[x][y])
       {
        Feld[x][y] = EL_EMPTY;
-       DrawLevelField(x, y);
+       DrawNewLevelField(x, y);
       }
     }
   }
@@ -1959,7 +1992,7 @@ static void ToggleBeltSwitch(int x, int y)
        if (e_belt_nr == belt_nr)
        {
          Feld[xx][yy] = belt_base_switch_element[belt_nr] + belt_dir_nr;
-         DrawLevelField(xx, yy);
+         DrawNewLevelField(xx, yy);
        }
       }
       else if (IS_BELT(element) && belt_dir != MV_NO_MOVING)
@@ -1971,7 +2004,7 @@ static void ToggleBeltSwitch(int x, int y)
          int belt_part = Feld[xx][yy] - belt_base_element[belt_nr];
 
          Feld[xx][yy] = belt_base_active_element[belt_nr] + belt_part;
-         DrawLevelField(xx, yy);
+         DrawNewLevelField(xx, yy);
        }
       }
       else if (IS_BELT_ACTIVE(element) && belt_dir == MV_NO_MOVING)
@@ -1983,7 +2016,7 @@ static void ToggleBeltSwitch(int x, int y)
          int belt_part = Feld[xx][yy] - belt_base_active_element[belt_nr];
 
          Feld[xx][yy] = belt_base_element[belt_nr] + belt_part;
-         DrawLevelField(xx, yy);
+         DrawNewLevelField(xx, yy);
        }
       }
     }
@@ -2006,7 +2039,7 @@ static void ToggleSwitchgateSwitch(int x, int y)
          element == EL_SWITCHGATE_SWITCH_DOWN)
       {
        Feld[xx][yy] = EL_SWITCHGATE_SWITCH_UP + game.switchgate_pos;
-       DrawLevelField(xx, yy);
+       DrawNewLevelField(xx, yy);
       }
       else if (element == EL_SWITCHGATE_OPEN ||
               element == EL_SWITCHGATE_OPENING)
@@ -2052,13 +2085,13 @@ static void RedrawAllLightSwitchesAndInvisibleElements()
          game.light_time_left > 0)
       {
        Feld[x][y] = EL_LIGHT_SWITCH_ACTIVE;
-       DrawLevelField(x, y);
+       DrawNewLevelField(x, y);
       }
       else if (element == EL_LIGHT_SWITCH_ACTIVE &&
               game.light_time_left == 0)
       {
        Feld[x][y] = EL_LIGHT_SWITCH;
-       DrawLevelField(x, y);
+       DrawNewLevelField(x, y);
       }
       else if (element == EL_INVISIBLE_STEELWALL ||
               element == EL_INVISIBLE_WALL ||
@@ -2067,7 +2100,7 @@ static void RedrawAllLightSwitchesAndInvisibleElements()
        if (game.light_time_left > 0)
          Feld[x][y] = getInvisibleActiveFromInvisibleElement(element);
 
-       DrawLevelField(x, y);
+       DrawNewLevelField(x, y);
       }
       else if (element == EL_INVISIBLE_STEELWALL_ACTIVE ||
               element == EL_INVISIBLE_WALL_ACTIVE ||
@@ -2076,7 +2109,7 @@ static void RedrawAllLightSwitchesAndInvisibleElements()
        if (game.light_time_left == 0)
          Feld[x][y] = getInvisibleFromInvisibleActiveElement(element);
 
-       DrawLevelField(x, y);
+       DrawNewLevelField(x, y);
       }
     }
   }
@@ -2964,7 +2997,16 @@ void StartMoving(int x, int y)
          phase = 7 - phase;
 
        if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
          DrawGraphic(SCREENX(x), SCREENY(y), el2gfx(element) + phase);
+#else
+       {
+         int graphic = el2img(element);
+         int frame = getNewGraphicAnimationFrame(graphic, MovDelay[x][y] % 8);
+
+         DrawNewGraphic(SCREENX(x), SCREENY(y), graphic, frame);
+       }
+#endif
 
        if (MovDelay[x][y] % 4 == 3)
        {
@@ -2975,23 +3017,36 @@ void StartMoving(int x, int y)
        }
       }
       else if (element == EL_SP_ELECTRON)
+#if 0
        DrawGraphicAnimation(x, y, GFX2_SP_ELECTRON, 8, 2, ANIM_LOOP);
+#else
+       DrawNewGraphicAnimation(x, y, IMG_SP_ELECTRON);
+#endif
       else if (element == EL_DRAGON)
       {
        int i;
        int dir = MovDir[x][y];
        int dx = (dir == MV_LEFT ? -1 : dir == MV_RIGHT ? +1 : 0);
        int dy = (dir == MV_UP   ? -1 : dir == MV_DOWN  ? +1 : 0);
+#if 0
        int graphic = (dir == MV_LEFT   ? GFX_FLAMMEN_LEFT :
                       dir == MV_RIGHT  ? GFX_FLAMMEN_RIGHT :
                       dir == MV_UP     ? GFX_FLAMMEN_UP :
                       dir == MV_DOWN   ? GFX_FLAMMEN_DOWN : GFX_LEERRAUM);
        int phase = FrameCounter % 2;
+#else
+       int graphic = (dir == MV_LEFT   ? IMG_FLAMES_LEFT1 :
+                      dir == MV_RIGHT  ? IMG_FLAMES_RIGHT1 :
+                      dir == MV_UP     ? IMG_FLAMES_UP1 :
+                      dir == MV_DOWN   ? IMG_FLAMES_DOWN1 : IMG_EMPTY);
+       int frame = getNewGraphicAnimationFrame(graphic, -1);
+#endif
 
        for (i=1; i<=3; i++)
        {
          int xx = x + i*dx, yy = y + i*dy;
          int sx = SCREENX(xx), sy = SCREENY(yy);
+         int flame_graphic = graphic + (i - 1);
 
          if (!IN_LEV_FIELD(xx, yy) ||
              IS_SOLID(Feld[xx][yy]) || Feld[xx][yy] == EL_EXPLOSION)
@@ -3008,13 +3063,17 @@ void StartMoving(int x, int y)
 
            Feld[xx][yy] = EL_FLAMES;
            if (IN_SCR_FIELD(sx, sy))
+#if 0
              DrawGraphic(sx, sy, graphic + phase*3 + i-1);
+#else
+             DrawNewGraphic(sx, sy, flame_graphic, frame);
+#endif
          }
          else
          {
            if (Feld[xx][yy] == EL_FLAMES)
              Feld[xx][yy] = EL_EMPTY;
-           DrawLevelField(xx, yy);
+           DrawNewLevelField(xx, yy);
          }
        }
       }
@@ -3063,7 +3122,12 @@ void StartMoving(int x, int y)
 
        PlaySoundLevel(newx, newy, SND_PENGUIN_PASSING_EXIT);
        if (IN_SCR_FIELD(SCREENX(newx), SCREENY(newy)))
+#if 0
          DrawGraphicThruMask(SCREENX(newx), SCREENY(newy), el2gfx(element));
+#else
+         DrawNewGraphicThruMask(SCREENX(newx), SCREENY(newy), el2img(element),
+                                0);
+#endif
 
        local_player->friends_still_needed--;
        if (!local_player->friends_still_needed &&
@@ -3592,7 +3656,7 @@ void AmoebeUmwandelnBD(int ax, int ay, int new_element)
        AmoebaNr[x][y] = 0;
        Feld[x][y] = new_element;
        InitField(x, y, FALSE);
-       DrawLevelField(x, y);
+       DrawNewLevelField(x, y);
        done = TRUE;
       }
     }
@@ -3627,13 +3691,22 @@ void AmoebeWaechst(int x, int y)
   {
     MovDelay[x][y]--;
     if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), GFX_AMOEBING + 3 - MovDelay[x][y]/2);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_AMOEBA_CREATING,
+                                             6 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_AMOEBA_CREATING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = Store[x][y];
       Store[x][y] = 0;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
@@ -3655,12 +3728,21 @@ void AmoebaDisappearing(int x, int y)
   {
     MovDelay[x][y]--;
     if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), GFX_AMOEBING + MovDelay[x][y]/2);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_AMOEBA_SHRINKING,
+                                             6 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_AMOEBA_SHRINKING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_EMPTY;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
 
       /* don't let mole enter this field in this cycle;
         (give priority to objects falling to this field from above) */
@@ -3685,7 +3767,7 @@ void AmoebeAbleger(int ax, int ay)
   if (!level.amoeba_speed)
   {
     Feld[ax][ay] = EL_AMOEBA_DEAD;
-    DrawLevelField(ax, ay);
+    DrawNewLevelField(ax, ay);
     return;
   }
 
@@ -3748,7 +3830,7 @@ void AmoebeAbleger(int ax, int ay)
       if (i == 4 && (!waiting_for_player || game.emulation == EMU_BOULDERDASH))
       {
        Feld[ax][ay] = EL_AMOEBA_DEAD;
-       DrawLevelField(ax, ay);
+       DrawNewLevelField(ax, ay);
        AmoebaCnt[AmoebaNr[ax][ay]]--;
 
        if (AmoebaCnt[AmoebaNr[ax][ay]] <= 0)   /* amoeba is completely dead */
@@ -3811,7 +3893,7 @@ void AmoebeAbleger(int ax, int ay)
     return;
   }
 
-  DrawLevelField(newax, neway);
+  DrawNewLevelField(newax, neway);
 }
 
 void Life(int ax, int ay)
@@ -3863,7 +3945,7 @@ void Life(int ax, int ay)
       {
        Feld[xx][yy] = EL_EMPTY;
        if (!Stop[xx][yy])
-         DrawLevelField(xx, yy);
+         DrawNewLevelField(xx, yy);
        Stop[xx][yy] = TRUE;
        changed = TRUE;
       }
@@ -3875,7 +3957,7 @@ void Life(int ax, int ay)
        Feld[xx][yy] = element;
        MovDelay[xx][yy] = (element == EL_GAMEOFLIFE ? 0 : life_time-1);
        if (!Stop[xx][yy])
-         DrawLevelField(xx, yy);
+         DrawNewLevelField(xx, yy);
        Stop[xx][yy] = TRUE;
        changed = TRUE;
       }
@@ -3898,7 +3980,15 @@ void RobotWheel(int x, int y)
     if (MovDelay[x][y])
     {
       if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
        DrawGraphic(SCREENX(x), SCREENY(y), GFX_ABLENK+MovDelay[x][y]%4);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_ROBOT_WHEEL_ACTIVE, -1);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_ROBOT_WHEEL_ACTIVE, frame);
+    }
+#endif
       if (!(MovDelay[x][y]%4))
        PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVE);
       return;
@@ -3906,7 +3996,7 @@ void RobotWheel(int x, int y)
   }
 
   Feld[x][y] = EL_ROBOT_WHEEL;
-  DrawLevelField(x, y);
+  DrawNewLevelField(x, y);
   if (ZX == x && ZY == y)
     ZX = ZY = -1;
 }
@@ -3922,8 +4012,16 @@ void TimegateWheel(int x, int y)
     if (MovDelay[x][y])
     {
       if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
        DrawGraphic(SCREENX(x), SCREENY(y),
                    GFX_TIMEGATE_SWITCH + MovDelay[x][y]%4);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_TIMEGATE_SWITCH_ACTIVE, -1);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_SWITCH_ACTIVE, frame);
+    }
+#endif
       if (!(MovDelay[x][y]%4))
        PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVE);
       return;
@@ -3931,17 +4029,21 @@ void TimegateWheel(int x, int y)
   }
 
   Feld[x][y] = EL_TIMEGATE_SWITCH;
-  DrawLevelField(x, y);
+  DrawNewLevelField(x, y);
   if (ZX == x && ZY == y)
     ZX = ZY = -1;
 }
 
 void Blubber(int x, int y)
 {
-  if (y > 0 && IS_MOVING(x, y-1) && MovDir[x][y-1] == MV_DOWN)
-    DrawLevelField(x, y-1);
+#if 0
+  if (y > 0 && IS_MOVING(x, y - 1) && MovDir[x][y - 1] == MV_DOWN)
+    DrawNewLevelField(x, y - 1);
   else
     DrawGraphicAnimation(x, y, GFX_GEBLUBBER, 4, 10, ANIM_LOOP);
+#else
+  DrawNewGraphicAnimation(x, y, IMG_ACID);
+#endif
 }
 
 void NussKnacken(int x, int y)
@@ -3953,13 +4055,22 @@ void NussKnacken(int x, int y)
   {
     MovDelay[x][y]--;
     if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y),
                  GFX_CRACKINGNUT + 3 - MovDelay[x][y]/2);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_NUT_CRACKING,
+                                             6 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_NUT_CRACKING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_EMERALD;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
@@ -3973,22 +4084,37 @@ void BreakingPearl(int x, int y)
   {
     MovDelay[x][y]--;
     if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y),
                  GFX_PEARL_BREAKING + 4 - MovDelay[x][y]/2);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_PEARL_BREAKING,
+                                             8 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_PEARL_BREAKING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_EMPTY;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
 
-void SiebAktivieren(int x, int y, int typ)
+void SiebAktivieren(int x, int y, int type)
 {
-  int graphic = (typ == 1 ? GFX_MAGIC_WALL_FULL : GFX_MAGIC_WALL_BD_FULL) + 3;
+#if 0
+  int graphic = (type == 1 ? GFX_MAGIC_WALL_FULL : GFX_MAGIC_WALL_BD_FULL) + 3;
 
   DrawGraphicAnimation(x, y, graphic, 4, 4, ANIM_REVERSE);
+#else
+  int graphic = (type == 1 ? IMG_MAGIC_WALL_FULL : IMG_BD_MAGIC_WALL_FULL);
+
+  DrawNewGraphicAnimation(x, y, graphic);
+#endif
 }
 
 void AusgangstuerPruefen(int x, int y)
@@ -4026,7 +4152,7 @@ void AusgangstuerOeffnen(int x, int y)
   int delay = 6;
 
   if (!MovDelay[x][y])         /* next animation frame */
-    MovDelay[x][y] = 5*delay;
+    MovDelay[x][y] = 5 * delay;
 
   if (MovDelay[x][y])          /* wait some time before next frame */
   {
@@ -4035,19 +4161,32 @@ void AusgangstuerOeffnen(int x, int y)
     MovDelay[x][y]--;
     tuer = MovDelay[x][y]/delay;
     if (!(MovDelay[x][y]%delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), GFX_AUSGANG_AUF-tuer);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_EXIT_OPENING,
+                                             29 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_EXIT_OPENING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_EXIT_OPEN;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
 
 void AusgangstuerBlinken(int x, int y)
 {
+#if 0
   DrawGraphicAnimation(x, y, GFX_AUSGANG_AUF, 4, 4, ANIM_PINGPONG);
+#else
+  DrawNewGraphicAnimation(x, y, IMG_EXIT_OPEN);
+#endif
 }
 
 void OpenSwitchgate(int x, int y)
@@ -4064,12 +4203,21 @@ void OpenSwitchgate(int x, int y)
     MovDelay[x][y]--;
     phase = MovDelay[x][y] / delay;
     if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), GFX_SWITCHGATE_OPEN - phase);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_SWITCHGATE_OPENING,
+                                             29 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_SWITCHGATE_OPENING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_SWITCHGATE_OPEN;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
@@ -4088,12 +4236,21 @@ void CloseSwitchgate(int x, int y)
     MovDelay[x][y]--;
     phase = MovDelay[x][y] / delay;
     if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), GFX_SWITCHGATE_CLOSED + phase);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_SWITCHGATE_CLOSING,
+                                             29 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_SWITCHGATE_CLOSING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_SWITCHGATE_CLOSED;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
@@ -4112,12 +4269,21 @@ void OpenTimegate(int x, int y)
     MovDelay[x][y]--;
     phase = MovDelay[x][y] / delay;
     if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), GFX_TIMEGATE_OPEN - phase);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_TIMEGATE_OPENING,
+                                             29 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_OPENING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_TIMEGATE_OPEN;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
@@ -4136,12 +4302,21 @@ void CloseTimegate(int x, int y)
     MovDelay[x][y]--;
     phase = MovDelay[x][y] / delay;
     if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), GFX_TIMEGATE_CLOSED + phase);
+#else
+    {
+      int frame = getNewGraphicAnimationFrame(IMG_TIMEGATE_CLOSING,
+                                             29 - MovDelay[x][y]);
+
+      DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_CLOSING, frame);
+    }
+#endif
 
     if (!MovDelay[x][y])
     {
       Feld[x][y] = EL_TIMEGATE_CLOSED;
-      DrawLevelField(x, y);
+      DrawNewLevelField(x, y);
     }
   }
 }
@@ -4171,7 +4346,11 @@ void EdelsteinFunkeln(int x, int y)
     return;
 
   if (Feld[x][y] == EL_BD_DIAMOND)
+#if 0
     DrawGraphicAnimation(x, y, GFX_EDELSTEIN_BD, 4, 4, ANIM_REVERSE);
+#else
+    DrawNewGraphicAnimation(x, y, IMG_BD_DIAMOND);
+#endif
   else
   {
     if (!MovDelay[x][y])       /* next animation frame */
@@ -4184,7 +4363,11 @@ void EdelsteinFunkeln(int x, int y)
       if (setup.direct_draw && MovDelay[x][y])
        SetDrawtoField(DRAW_BUFFERED);
 
+#if 0
       DrawGraphic(SCREENX(x), SCREENY(y), el2gfx(Feld[x][y]));
+#else
+      DrawNewGraphic(SCREENX(x), SCREENY(y), el2img(Feld[x][y]), 0);
+#endif
 
       if (MovDelay[x][y])
       {
@@ -4193,14 +4376,24 @@ void EdelsteinFunkeln(int x, int y)
        if (phase > 2)
          phase = 4-phase;
 
+#if 0
        DrawGraphicThruMask(SCREENX(x), SCREENY(y), GFX_FUNKELN_WEISS + phase);
+#else
+       {
+         int frame = getNewGraphicAnimationFrame(IMG_TWINKLE_WHITE,
+                                                 10 - MovDelay[x][y]);
+
+         DrawNewGraphicThruMask(SCREENX(x), SCREENY(y), IMG_TWINKLE_WHITE,
+                                frame);
+       }
+#endif
 
        if (setup.direct_draw)
        {
          int dest_x, dest_y;
 
-         dest_x = FX + SCREENX(x)*TILEX;
-         dest_y = FY + SCREENY(y)*TILEY;
+         dest_x = FX + SCREENX(x) * TILEX;
+         dest_y = FY + SCREENY(y) * TILEY;
 
          BlitBitmap(drawto_field, window,
                     dest_x, dest_y, TILEX, TILEY, dest_x, dest_y);