- 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;
- DrawNewLevelField(x, y);
- }
- }
-}
-
-static void CloseAllOpenTimegates()
-{
- int x, y;
-
- for (y=0; y<lev_fieldy; y++)
- {
- for (x=0; x<lev_fieldx; x++)
- {
- int element = Feld[x][y];
-
- if (element == EL_TIMEGATE_OPEN || element == EL_TIMEGATE_OPENING)
- {
- Feld[x][y] = EL_TIMEGATE_CLOSING;
- PlaySoundLevel(x, y, SND_TIMEGATE_CLOSING);
- }
- }
- }
-}
-
-void EdelsteinFunkeln(int x, int y)
-{
- if (!IN_SCR_FIELD(SCREENX(x), SCREENY(y)) || IS_MOVING(x, 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 */
- MovDelay[x][y] = 11 * !SimpleRND(500);
-
- if (MovDelay[x][y]) /* wait some time before next frame */
- {
- MovDelay[x][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])
- {
- int phase = (MovDelay[x][y]-1)/2;
-
- 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;
-
- BlitBitmap(drawto_field, window,
- dest_x, dest_y, TILEX, TILEY, dest_x, dest_y);
- SetDrawtoField(DRAW_DIRECT);
- }
- }
- }
- }
-}
-
-void MauerWaechst(int x, int y)
-{
- int delay = 6;
-
- if (!MovDelay[x][y]) /* next animation frame */
- MovDelay[x][y] = 3 * delay;
-
- if (MovDelay[x][y]) /* wait some time before next frame */
- {
- int phase;
-
- MovDelay[x][y]--;
- phase = 2 - MovDelay[x][y] / delay;
-#if 0
- if (!(MovDelay[x][y]%delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
- DrawGraphic(SCREENX(x), SCREENY(y),
- (MovDir[x][y] == MV_LEFT ? GFX_MAUER_LEFT :
- MovDir[x][y] == MV_RIGHT ? GFX_MAUER_RIGHT :
- MovDir[x][y] == MV_UP ? GFX_MAUER_UP :
- GFX_MAUER_DOWN ) + phase);
-#else
- if (IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
- {
- int graphic = el_dir2img(Feld[x][y], MovDir[x][y]);
- int frame = getNewGraphicAnimationFrame(graphic, 17 - MovDelay[x][y]);
-
- DrawNewGraphic(SCREENX(x), SCREENY(y), graphic, frame);
- }
-#endif
-
- if (!MovDelay[x][y])
- {
- if (MovDir[x][y] == MV_LEFT)
- {
- if (IN_LEV_FIELD(x - 1, y) && IS_MAUER(Feld[x - 1][y]))
- DrawNewLevelField(x - 1, y);
- }
- else if (MovDir[x][y] == MV_RIGHT)
- {
- if (IN_LEV_FIELD(x + 1, y) && IS_MAUER(Feld[x + 1][y]))
- DrawNewLevelField(x + 1, y);
- }
- else if (MovDir[x][y] == MV_UP)
- {
- if (IN_LEV_FIELD(x, y - 1) && IS_MAUER(Feld[x][y - 1]))
- DrawNewLevelField(x, y - 1);
- }
- else
- {
- if (IN_LEV_FIELD(x, y + 1) && IS_MAUER(Feld[x][y + 1]))
- DrawNewLevelField(x, y + 1);
- }
-
- Feld[x][y] = Store[x][y];
- Store[x][y] = 0;
- MovDir[x][y] = MV_NO_MOVING;
- DrawNewLevelField(x, y);
- }
- }
-}
-
-void MauerAbleger(int ax, int ay)
-{
- int element = Feld[ax][ay];
- boolean oben_frei = FALSE, unten_frei = FALSE;
- boolean links_frei = FALSE, rechts_frei = FALSE;
- boolean oben_massiv = FALSE, unten_massiv = FALSE;
- boolean links_massiv = FALSE, rechts_massiv = FALSE;
- boolean new_wall = FALSE;
-
- if (!MovDelay[ax][ay]) /* start building new wall */
- MovDelay[ax][ay] = 6;
-
- if (MovDelay[ax][ay]) /* wait some time before building new wall */
- {
- MovDelay[ax][ay]--;
- if (MovDelay[ax][ay])
- return;
- }
-
- if (IN_LEV_FIELD(ax, ay-1) && IS_FREE(ax, ay-1))
- oben_frei = TRUE;
- if (IN_LEV_FIELD(ax, ay+1) && IS_FREE(ax, ay+1))
- unten_frei = TRUE;
- if (IN_LEV_FIELD(ax-1, ay) && IS_FREE(ax-1, ay))
- links_frei = TRUE;
- if (IN_LEV_FIELD(ax+1, ay) && IS_FREE(ax+1, ay))
- rechts_frei = TRUE;
-
- if (element == EL_WALL_GROWING_Y || element == EL_WALL_GROWING_XY)
- {
- if (oben_frei)
- {
- Feld[ax][ay-1] = EL_WALL_GROWING_ACTIVE;
- Store[ax][ay-1] = element;
- MovDir[ax][ay-1] = MV_UP;
- if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay-1)))
-#if 0
- DrawGraphic(SCREENX(ax), SCREENY(ay-1), GFX_MAUER_UP);
-#else
- DrawNewGraphic(SCREENX(ax), SCREENY(ay - 1),
- IMG_WALL_GROWING_ACTIVE_UP, 0);
-#endif
- new_wall = TRUE;
- }
- if (unten_frei)
- {
- Feld[ax][ay+1] = EL_WALL_GROWING_ACTIVE;
- Store[ax][ay+1] = element;
- MovDir[ax][ay+1] = MV_DOWN;
- if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay+1)))
-#if 0
- DrawGraphic(SCREENX(ax), SCREENY(ay+1), GFX_MAUER_DOWN);
-#else
- DrawNewGraphic(SCREENX(ax), SCREENY(ay + 1),
- IMG_WALL_GROWING_ACTIVE_DOWN, 0);
-#endif
- new_wall = TRUE;
- }
- }
-
- if (element == EL_WALL_GROWING_X || element == EL_WALL_GROWING_XY ||
- element == EL_WALL_GROWING)
- {
- if (links_frei)
- {
- Feld[ax-1][ay] = EL_WALL_GROWING_ACTIVE;