fixed various graphics functions for Mirror Magic game engine
authorHolger Schemel <info@artsoft.org>
Sat, 18 Feb 2017 11:44:16 +0000 (12:44 +0100)
committerHolger Schemel <info@artsoft.org>
Fri, 23 Mar 2018 22:21:08 +0000 (23:21 +0100)
src/game_mm/mm_game.c
src/game_mm/mm_game.h
src/game_mm/mm_main.h
src/game_mm/mm_tools.c

index bc96959f179e1470e8477ff507e7379691a7671b..6b8d02aeba340cbae2f6c72d414747dc6904344f 100644 (file)
@@ -344,7 +344,9 @@ void InitGameEngine_MM()
     }
   }
 
     }
   }
 
+#if 0
   CloseDoor(DOOR_CLOSE_1);
   CloseDoor(DOOR_CLOSE_1);
+#endif
 
   DrawLevel_MM();
   InitCycleElements();
 
   DrawLevel_MM();
   InitCycleElements();
@@ -365,8 +367,10 @@ void InitGameEngine_MM()
           int2str(game_mm.score, 4), FONT_TEXT_2);
 #endif
 
           int2str(game_mm.score, 4), FONT_TEXT_2);
 #endif
 
+#if 0
   UnmapGameButtons();
   MapGameButtons();
   UnmapGameButtons();
   MapGameButtons();
+#endif
 
 #if 0
   /* copy actual game door content to door double buffer for OpenDoor() */
 
 #if 0
   /* copy actual game door content to door double buffer for OpenDoor() */
@@ -374,7 +378,9 @@ void InitGameEngine_MM()
             DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 #endif
 
             DX, DY, DXSIZE, DYSIZE, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 #endif
 
+#if 0
   OpenDoor(DOOR_OPEN_ALL);
   OpenDoor(DOOR_OPEN_ALL);
+#endif
 
   if (setup.sound_loops)
     PlaySoundExt(SND_FUEL, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP);
 
   if (setup.sound_loops)
     PlaySoundExt(SND_FUEL, SOUND_MAX_VOLUME, SOUND_MAX_RIGHT, SND_CTRL_PLAY_LOOP);
@@ -461,13 +467,13 @@ boolean StepBehind()
 static int getMaskFromElement(int element)
 {
   if (IS_GRID(element))
 static int getMaskFromElement(int element)
 {
   if (IS_GRID(element))
-    return GFX_MASK_GRID_00 + get_element_phase(element);
+    return IMG_MM_MASK_GRID_1 + get_element_phase(element);
   else if (IS_MCDUFFIN(element))
   else if (IS_MCDUFFIN(element))
-    return GFX_MASK_MCDUFFIN_00 + get_element_phase(element);
+    return IMG_MM_MASK_MCDUFFIN_RIGHT + get_element_phase(element);
   else if (IS_RECTANGLE(element) || IS_DF_GRID(element))
   else if (IS_RECTANGLE(element) || IS_DF_GRID(element))
-    return GFX_MASK_RECTANGLE;
+    return IMG_MM_MASK_RECTANGLE;
   else
   else
-    return GFX_MASK_CIRCLE;
+    return IMG_MM_MASK_CIRCLE;
 }
 
 int ScanPixel()
 }
 
 int ScanPixel()
@@ -525,16 +531,15 @@ int ScanPixel()
          int mask_x, mask_y;
          int dx = px - lx * TILEX;
          int dy = py - ly * TILEY;
          int mask_x, mask_y;
          int dx = px - lx * TILEX;
          int dy = py - ly * TILEY;
+         Bitmap *bitmap;
+         int src_x, src_y;
 
 
-         mask_x = (graphic_mask % GFX_PER_LINE) * TILEX + dx;
-         mask_y = (graphic_mask / GFX_PER_LINE) * TILEY + dy;
+         getGraphicSource(graphic_mask, 0, &bitmap, &src_x, &src_y);
 
 
-#if 1
-         // !!! temporary fix to compile -- change to game graphics !!!
-         pixel = (ReadPixel(drawto, mask_x, mask_y) ? 1 : 0);
-#else
-         pixel = (ReadPixel(pix[PIX_BACK], mask_x, mask_y) ? 1 : 0);
-#endif
+         mask_x = src_x + dx;
+         mask_y = src_y + dy;
+
+         pixel = (ReadPixel(bitmap, mask_x, mask_y) ? 1 : 0);
        }
       }
       else
        }
       }
       else
@@ -2133,28 +2138,29 @@ static void Explode_MM(int x, int y, int phase, int mode)
   }
   else if (!(phase % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
   {
   }
   else if (!(phase % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y)))
   {
-    int graphic = GFX_EXPLOSION_START;
+    int graphic = IMG_MM_DEFAULT_EXPLODING;
     int graphic_phase = (phase / delay - 1);
     int graphic_phase = (phase / delay - 1);
+    Bitmap *bitmap;
+    int src_x, src_y;
 
     if (Store2[x][y] == EX_KETTLE)
     {
       if (graphic_phase < 3)
 
     if (Store2[x][y] == EX_KETTLE)
     {
       if (graphic_phase < 3)
-       graphic = GFX_EXPLOSION_KETTLE;
+       graphic = IMG_MM_KETTLE_EXPLODING;
       else if (graphic_phase < 5)
       {
       else if (graphic_phase < 5)
       {
-       graphic = GFX_EXPLOSION_LAST;
-       graphic_phase -= graphic_phase;
+       graphic_phase += 3;
       }
       else
       {
       }
       else
       {
-       graphic = GFX_EMPTY;
+       graphic = IMG_EMPTY;
        graphic_phase = 0;
       }
     }
     else if (Store2[x][y] == EX_SHORT)
     {
       if (graphic_phase < 4)
        graphic_phase = 0;
       }
     }
     else if (Store2[x][y] == EX_SHORT)
     {
       if (graphic_phase < 4)
-       graphic = GFX_EXPLOSION_SHORT;
+       graphic_phase += 4;
       else
       {
        graphic = GFX_EMPTY;
       else
       {
        graphic = GFX_EMPTY;
@@ -2162,7 +2168,11 @@ static void Explode_MM(int x, int y, int phase, int mode)
       }
     }
 
       }
     }
 
-    DrawGraphic_MM(x, y, graphic + graphic_phase);
+    getGraphicSource(graphic, graphic_phase, &bitmap, &src_x, &src_y);
+
+    BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY,
+              FX + x * TILEX, FY + y * TILEY);
+    MarkTileDirty(x, y);
   }
 }
 
   }
 }
 
@@ -2425,7 +2435,7 @@ void ClickElement(int mx, int my, int button)
     laser.fuse_off = FALSE;
     laser.fuse_x = laser.fuse_y = -1;
 
     laser.fuse_off = FALSE;
     laser.fuse_x = laser.fuse_y = -1;
 
-    DrawGraphic_MM(x, y, GFX_FUSE_ON);
+    DrawGraphic_MM(x, y, IMG_MM_FUSE_ACTIVE);
     ScanLaser();
   }
   else if (element == EL_FUSE_ON && !laser.fuse_off && new_button)
     ScanLaser();
   }
   else if (element == EL_FUSE_ON && !laser.fuse_off && new_button)
@@ -2436,7 +2446,7 @@ void ClickElement(int mx, int my, int button)
     laser.overloaded = FALSE;
 
     DrawLaser(0, DL_LASER_DISABLED);
     laser.overloaded = FALSE;
 
     DrawLaser(0, DL_LASER_DISABLED);
-    DrawGraphic_MM(x, y, GFX_FUSE_OFF);
+    DrawGraphic_MM(x, y, IMG_MM_FUSE);
   }
   else if (element == EL_LIGHTBALL)
   {
   }
   else if (element == EL_LIGHTBALL)
   {
@@ -2960,7 +2970,7 @@ void GameActions_MM(byte action[MAX_PLAYERS], boolean warp_mode)
     laser.fuse_x = ELX;
     laser.fuse_y = ELY;
     DrawLaser(0, DL_LASER_DISABLED);
     laser.fuse_x = ELX;
     laser.fuse_y = ELY;
     DrawLaser(0, DL_LASER_DISABLED);
-    DrawGraphic_MM(ELX, ELY, GFX_FUSE_OFF);
+    DrawGraphic_MM(ELX, ELY, IMG_MM_FUSE);
   }
 
   if (element == EL_BALL_GRAY && CT > 1500)
   }
 
   if (element == EL_BALL_GRAY && CT > 1500)
@@ -3398,7 +3408,7 @@ void MovePacMen()
     game_mm.pacman[p].x = nx;
     game_mm.pacman[p].y = ny;
     g = Feld[nx][ny] - EL_PACMAN_RIGHT;
     game_mm.pacman[p].x = nx;
     game_mm.pacman[p].y = ny;
     g = Feld[nx][ny] - EL_PACMAN_RIGHT;
-    DrawGraphic_MM(ox, oy, GFX_EMPTY);
+    DrawGraphic_MM(ox, oy, IMG_EMPTY);
 
     if (element != EL_EMPTY)
     {
 
     if (element != EL_EMPTY)
     {
index 75edb4294788b1b88dc749aec1c89bd913be482b..c0d5af9066bfeedd48456d96dace8ee5e5c8fa19 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "main_mm.h"
 
 
 #include "main_mm.h"
 
+
 /* score for elements (also used by editor.c) */
 #define SC_EDELSTEIN           0
 #define SC_DIAMANT             1
 /* score for elements (also used by editor.c) */
 #define SC_EDELSTEIN           0
 #define SC_DIAMANT             1
 #define SC_KEY                 9
 #define SC_ZEITBONUS           10
 
 #define SC_KEY                 9
 #define SC_ZEITBONUS           10
 
-void GetPlayerConfig(void);
-void InitGame(void);
-void InitMovDir(int, int);
+
 void InitAmoebaNr(int, int);
 void InitAmoebaNr(int, int);
-void GameWon(void);
+void GameWon_MM(void);
 int NewHiScore_MM(void);
 int NewHiScore_MM(void);
-void InitMovingField(int, int, int);
-void Moving2Blocked(int, int, int *, int *);
-void Blocked2Moving(int, int, int *, int *);
-int MovingOrBlocked2Element(int, int);
-void RemoveMovingField(int, int);
-
-
-
-
 
 void Blurb(int, int);
 void Impact(int, int);
 void TurnRound(int, int);
 
 void Blurb(int, int);
 void Impact(int, int);
 void TurnRound(int, int);
-void StartMoving(int, int);
-void ContinueMoving(int, int);
 int AmoebeNachbarNr(int, int);
 void AmoebeUmwandeln(int, int);
 void AmoebeUmwandelnBD(int, int, int);
 int AmoebeNachbarNr(int, int);
 void AmoebeUmwandeln(int, int);
 void AmoebeUmwandelnBD(int, int, int);
@@ -65,8 +53,6 @@ void EdelsteinFunkeln(int, int);
 void MauerWaechst(int, int);
 void MauerAbleger(int, int);
 
 void MauerWaechst(int, int);
 void MauerAbleger(int, int);
 
-
-
 boolean MoveFigureOneStep(struct PlayerInfo *, int, int, int, int);
 boolean MoveFigure(struct PlayerInfo *, int, int);
 void ScrollFigure(struct PlayerInfo *, int);
 boolean MoveFigureOneStep(struct PlayerInfo *, int, int, int, int);
 boolean MoveFigure(struct PlayerInfo *, int, int);
 void ScrollFigure(struct PlayerInfo *, int);
@@ -86,14 +72,10 @@ int DigField(struct PlayerInfo *, int, int, int, int, int);
 boolean SnapField(struct PlayerInfo *, int, int);
 boolean PlaceBomb(struct PlayerInfo *);
 void PlaySoundLevel(int, int, int);
 boolean SnapField(struct PlayerInfo *, int, int);
 boolean PlaceBomb(struct PlayerInfo *);
 void PlaySoundLevel(int, int, int);
-void RaiseScore(int);
-void RaiseScoreElement(int);
 
 void CreateGameButtons();
 void UnmapGameButtons();
 
 
 void CreateGameButtons();
 void UnmapGameButtons();
 
-
-void InitGame(void);
 void AddLaserEdge(int, int);
 void AddDamagedField(int, int);
 void ScanLaser(void);
 void AddLaserEdge(int, int);
 void AddDamagedField(int, int);
 void ScanLaser(void);
@@ -106,14 +88,12 @@ boolean HitLaserSource(int, int);
 boolean HitLaserDestination(int, int);
 boolean HitReflectingWalls(int, int);
 boolean HitAbsorbingWalls(int, int);
 boolean HitLaserDestination(int, int);
 boolean HitReflectingWalls(int, int);
 boolean HitAbsorbingWalls(int, int);
-void Bang(int, int);
 void ClickElement(int, int, int);
 void RotateMirror(int, int, int);
 boolean ObjHit(int, int, int);
 void DeletePacMan(int, int);
 
 void ColorCycling(void);
 void ClickElement(int, int, int);
 void RotateMirror(int, int, int);
 boolean ObjHit(int, int, int);
 void DeletePacMan(int, int);
 
 void ColorCycling(void);
-void GameActions(void);
 void MovePacMen(void);
 
 #endif
 void MovePacMen(void);
 
 #endif
index f58deca194bc33bd143dac2d9726d94148da6c09..b553a1f8756550e3a33807fb8c472ea6d0dc4de6 100644 (file)
@@ -658,8 +658,6 @@ extern int          num_element_info;
 #define EL_BLOCKED             600
 #define EL_EXPLODING_OPAQUE    601
 #define EL_EXPLODING_TRANSP    602
 #define EL_BLOCKED             600
 #define EL_EXPLODING_OPAQUE    601
 #define EL_EXPLODING_TRANSP    602
-#define EL_DEFAULT_EXPLODING   603
-#define EL_KETTLE_EXPLODING    604
 
 /* dummy elements (never used as game elements, only used as graphics) */
 #define EL_MM_MASK_MCDUFFIN_RIGHT      700
 
 /* dummy elements (never used as game elements, only used as graphics) */
 #define EL_MM_MASK_MCDUFFIN_RIGHT      700
index 4f61964c012ad0f0c9e8128455cd25a962bfe6cb..5c67bbe42b4b7b7e503111c2d43e329830832c40 100644 (file)
@@ -81,7 +81,6 @@ void DrawGraphic_MM(int x, int y, int graphic)
   {
     printf("DrawGraphic_MM(): x = %d, y = %d, graphic = %d\n",x,y,graphic);
     printf("DrawGraphic_MM(): This should never happen!\n");
   {
     printf("DrawGraphic_MM(): x = %d, y = %d, graphic = %d\n",x,y,graphic);
     printf("DrawGraphic_MM(): This should never happen!\n");
-
     return;
   }
 #endif
     return;
   }
 #endif
@@ -120,7 +119,7 @@ void DrawGraphicThruMaskExt_MM(DrawBuffer *d, int dest_x, int dest_y,
   int src_x, src_y;
   Bitmap *src_bitmap;
 
   int src_x, src_y;
   Bitmap *src_bitmap;
 
-  if (graphic == GFX_EMPTY)
+  if (graphic == IMG_EMPTY)
     return;
 
   getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y);
     return;
 
   getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y);
@@ -391,7 +390,7 @@ void DrawMiniElement_MM(int x, int y, int element)
 
   if (!element)
   {
 
   if (!element)
   {
-    DrawMiniGraphic_MM(x, y, GFX_EMPTY);
+    DrawMiniGraphic_MM(x, y, IMG_EMPTY);
     return;
   }
 
     return;
   }
 
@@ -439,7 +438,7 @@ void DrawWallsExt_MM(int x, int y, int element, int draw_mask)
   getMiniGraphicSource(graphic, &bitmap, &gx, &gy);
 
   if (game_status != LEVELED || !editor.draw_walls_masked)
   getMiniGraphicSource(graphic, &bitmap, &gx, &gy);
 
   if (game_status != LEVELED || !editor.draw_walls_masked)
-    DrawGraphic_MM(x, y, GFX_EMPTY);
+    DrawGraphic_MM(x, y, IMG_EMPTY);
 
   /*
   if (IS_WALL_WOOD(element) || IS_WALL_AMOEBA(element) ||
 
   /*
   if (IS_WALL_WOOD(element) || IS_WALL_AMOEBA(element) ||
@@ -474,51 +473,45 @@ void DrawWalls_MM(int x, int y, int element)
 
 void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask)
 {
 
 void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask)
 {
-  int graphic = GFX_WALL_SEVERAL;
-  int graphic_anim = graphic + (phase + 1) / 2;
-  int dx = (IS_WALL_AMOEBA(element) ? MINI_TILEX : 0);
-  int dy = MINI_TILEY;
-  int dx_anim = dx;
-  int dy_anim = ((phase + 1) % 2) * MINI_TILEY;
   int i;
 
   int i;
 
-  Bitmap *bitmap, *bitmap_anim;
-  int src_x, src_y;
-  int src_x_anim, src_y_anim;
-
-  getGraphicSource(graphic, 0, &bitmap, &src_x, &src_y);
-  getGraphicSource(graphic_anim, 0, &bitmap_anim, &src_x_anim, &src_y_anim);
-
   if (phase == 0)
   {
     DrawWalls_MM(x, y, element);
   if (phase == 0)
   {
     DrawWalls_MM(x, y, element);
+
     return;
   }
 
     return;
   }
 
-  for(i=0; i<4; i++)
+  for (i = 0; i < 4; i++)
   {
     if (element & (1 << i))
     {
   {
     if (element & (1 << i))
     {
-      int dest_x = SX + x * TILEX + MINI_TILEX * (i % 2);
-      int dest_y = SY + y * TILEY + MINI_TILEY * (i / 2);
-      int gx, gy;
+      int graphic;
+      int frame;
+      Bitmap *bitmap;
+      int src_x, src_y;
+      int dst_x = SX + x * TILEX + (i % 2) * MINI_TILEX;
+      int dst_y = SY + y * TILEY + (i / 2) * MINI_TILEY;
 
       if (bit_mask & (1 << i))
       {
 
       if (bit_mask & (1 << i))
       {
-       gx = src_x_anim + dx_anim;
-       gy = src_y_anim + dy_anim;
-
-       BlitBitmap(bitmap_anim, drawto, gx, gy, MINI_TILEX, MINI_TILEY,
-                  dest_x, dest_y);
+       graphic = (IS_WALL_AMOEBA(element) ?
+                  IMG_MM_AMOEBA_WALL_GROWING :
+                  IMG_MM_ICE_WALL_SHRINKING);
+       frame = phase;
       }
       else
       {
       }
       else
       {
-       gx = src_x + dx;
-       gy = src_y + dy;
-
-       BlitBitmap(bitmap, drawto, gx, gy, MINI_TILEX, MINI_TILEY,
-                  dest_x, dest_y);
+       graphic = (IS_WALL_AMOEBA(element) ?
+                  IMG_MM_AMOEBA_WALL :
+                  IMG_MM_ICE_WALL);
+       frame = 0;
       }
       }
+
+      getGraphicSource(graphic, frame, &bitmap, &src_x, &src_y);
+
+      BlitBitmap(bitmap, drawto, src_x, src_y, MINI_TILEX, MINI_TILEY,
+                dst_x, dst_y);
     }
   }
 
     }
   }
 
@@ -528,7 +521,7 @@ void DrawWallsAnimation_MM(int x, int y, int element, int phase, int bit_mask)
 void DrawElement_MM(int x, int y, int element)
 {
   if (element == EL_EMPTY)
 void DrawElement_MM(int x, int y, int element)
 {
   if (element == EL_EMPTY)
-    DrawGraphic_MM(x, y, GFX_EMPTY);
+    DrawGraphic_MM(x, y, IMG_EMPTY);
   else if (IS_WALL(element))
     DrawWalls_MM(x, y, element);
 #if 0
   else if (IS_WALL(element))
     DrawWalls_MM(x, y, element);
 #if 0
@@ -731,113 +724,13 @@ int get_rotated_element(int element, int step)
 
 int el2gfx(int element)
 {
 
 int el2gfx(int element)
 {
-  switch(element)
+  switch (element)
   {
   {
-    case EL_EMPTY:             return -1;
-    case EL_GRID_STEEL_00:     return GFX_GRID_STEEL_00;
-    case EL_GRID_STEEL_01:     return GFX_GRID_STEEL_01;
-    case EL_GRID_STEEL_02:     return GFX_GRID_STEEL_02;
-    case EL_GRID_STEEL_03:     return GFX_GRID_STEEL_03;
-    case EL_MCDUFFIN_RIGHT:    return GFX_MCDUFFIN_RIGHT;
-    case EL_MCDUFFIN_UP:       return GFX_MCDUFFIN_UP;
-    case EL_MCDUFFIN_LEFT:     return GFX_MCDUFFIN_LEFT;
-    case EL_MCDUFFIN_DOWN:     return GFX_MCDUFFIN_DOWN;
-    case EL_EXIT_CLOSED:       return GFX_EXIT_CLOSED;
-    case EL_EXIT_OPENING_1:    return GFX_EXIT_OPENING_1;
-    case EL_EXIT_OPENING_2:    return GFX_EXIT_OPENING_2;
-    case EL_EXIT_OPEN:         return GFX_EXIT_OPEN;
-    case EL_KETTLE:            return GFX_KETTLE;
-    case EL_BOMB:              return GFX_BOMB;
-    case EL_PRISM:             return GFX_PRISM;
-    case EL_BLOCK_WOOD:                return GFX_BLOCK_WOOD;
-    case EL_BALL_GRAY:         return GFX_BALL_GRAY;
-    case EL_FUSE_ON:           return GFX_FUSE_ON;
-    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_POLAR_CROSS_00:    return GFX_POLAR_CROSS_00;
-    case EL_POLAR_CROSS_01:    return GFX_POLAR_CROSS_01;
-    case EL_POLAR_CROSS_02:    return GFX_POLAR_CROSS_02;
-    case EL_POLAR_CROSS_03:    return GFX_POLAR_CROSS_03;
-    case EL_MIRROR_FIXED_00:   return GFX_MIRROR_FIXED_00;
-    case EL_MIRROR_FIXED_01:   return GFX_MIRROR_FIXED_01;
-    case EL_MIRROR_FIXED_02:   return GFX_MIRROR_FIXED_02;
-    case EL_MIRROR_FIXED_03:   return GFX_MIRROR_FIXED_03;
-    case EL_GATE_STONE:                return GFX_GATE_STONE;
-    case EL_KEY:               return GFX_KEY;
-    case EL_LIGHTBULB_ON:      return GFX_LIGHTBULB_ON;
-    case EL_LIGHTBULB_OFF:     return GFX_LIGHTBULB_OFF;
-    case EL_LIGHTBALL:         return GFX_BALL_RED + RND(3);;
-    case EL_BLOCK_STONE:       return GFX_BLOCK_STONE;
-    case EL_GATE_WOOD:         return GFX_GATE_WOOD;
-    case EL_FUEL_FULL:         return GFX_FUEL_FULL;
-    case EL_GRID_WOOD_00:      return GFX_GRID_WOOD_00;
-    case EL_GRID_WOOD_01:      return GFX_GRID_WOOD_01;
-    case EL_GRID_WOOD_02:      return GFX_GRID_WOOD_02;
-    case EL_GRID_WOOD_03:      return GFX_GRID_WOOD_03;
-    case EL_FUEL_EMPTY:                return GFX_FUEL_EMPTY;
-    case EL_FUSE_OFF:          return GFX_FUSE_OFF;
-    case EL_PACMAN:            return GFX_PACMAN;
-    case EL_REFRACTOR:         return GFX_REFRACTOR;
-    case EL_CELL:              return GFX_CELL;
-    case EL_MINE:              return GFX_MINE;
-
-    /* pseudo-graphics; will be mapped to other graphics */
-    case EL_WALL_STEEL:                return GFX_WALL_STEEL;
-    case EL_WALL_WOOD:         return GFX_WALL_WOOD;
-    case EL_WALL_ICE:          return GFX_WALL_ICE;
-    case EL_WALL_AMOEBA:       return GFX_WALL_AMOEBA;
-    case EL_DF_WALL_STEEL:     return GFX_DF_WALL_STEEL;
-    case EL_DF_WALL_WOOD:      return GFX_DF_WALL_WOOD;
+    case EL_LIGHTBALL:
+      return IMG_MM_LIGHTBALL_RED + RND(3);
 
     default:
 
     default:
-    {
-      boolean ed = (game_status == LEVELED);
-      int base_element = get_base_element(element);
-      int element_phase = element - base_element;
-      int base_graphic;
-
-      if (IS_BEAMER(element))
-       element_phase = element - EL_BEAMER_RED_START;
-      else if (IS_FIBRE_OPTIC(element))
-       element_phase = element - EL_FIBRE_OPTIC_START;
-
-      if (IS_MIRROR(element))
-       base_graphic = GFX_MIRROR_START;
-      else if (IS_BEAMER_OLD(element))
-       base_graphic = GFX_BEAMER_START;
-      else if (IS_POLAR(element))
-       base_graphic = GFX_POLAR_START;
-      else if (IS_CHAR(element))
-       base_graphic = GFX_CHAR_START;
-      else if (IS_GRID_WOOD_FIXED(element))
-       base_graphic = GFX_GRID_WOOD_FIXED_00;
-      else if (IS_GRID_STEEL_FIXED(element))
-       base_graphic = GFX_GRID_STEEL_FIXED_00;
-      else if (IS_DF_MIRROR(element))
-       base_graphic = GFX_DF_MIRROR_00;
-      else if (IS_LASER(element))
-       base_graphic = GFX_LASER_RIGHT;
-      else if (IS_RECEIVER(element))
-       base_graphic = GFX_RECEIVER_RIGHT;
-      else if (IS_DF_MIRROR(element))
-       base_graphic = GFX_DF_MIRROR_00;
-      else if (IS_FIBRE_OPTIC(element))
-       base_graphic = (ed ? GFX_FIBRE_OPTIC_ED_00 : GFX_FIBRE_OPTIC_00);
-      else if (IS_GRID_WOOD_AUTO(element))
-       base_graphic = (ed ? GFX_GRID_WOOD_AUTO_00 : GFX_GRID_WOOD_FIXED_00);
-      else if (IS_GRID_STEEL_AUTO(element))
-       base_graphic = (ed ? GFX_GRID_STEEL_AUTO_00 : GFX_GRID_STEEL_FIXED_00);
-      else if (IS_DF_MIRROR_AUTO(element))
-       base_graphic = (ed ? GFX_DF_MIRROR_AUTO_00 : GFX_DF_MIRROR_00);
-      else if (IS_BEAMER(element))
-       base_graphic = GFX_BEAMER_RED_START;
-      else
-       return GFX_EMPTY;
-
-      return base_graphic + element_phase;
-    }
+      return el2img_mm(element);
   }
 }
 
   }
 }
 
@@ -848,5 +741,6 @@ void RedrawPlayfield_MM()
 
 void BlitScreenToBitmap_MM(Bitmap *target_bitmap)
 {
 
 void BlitScreenToBitmap_MM(Bitmap *target_bitmap)
 {
-  BlitBitmap(drawto_field, target_bitmap, 0, 0, SXSIZE, SYSIZE, SX, SY);
+  BlitBitmap(drawto_field, target_bitmap,
+            REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, REAL_SX, REAL_SY);
 }
 }