rnd-20030306-3-src
[rocksndiamonds.git] / src / tools.c
index f41affe9cdab8bc4f225d23d74e11f4970c2e41b..979eead935e254fe9a62febb76a90bb2a6290194 100644 (file)
@@ -243,19 +243,18 @@ void BackToFront()
                     VX+VIDEO_CONTROL_XPOS,VY+VIDEO_CONTROL_YPOS);
       }
     }
+
     if (redraw_mask & REDRAW_DOOR_3)
       BlitBitmap(backbuffer, window, EX, EY, EXSIZE, EYSIZE, EX, EY);
+
     redraw_mask &= ~REDRAW_DOORS;
   }
 
   if (redraw_mask & REDRAW_MICROLEVEL)
   {
-    BlitBitmap(backbuffer, window,
-              MICROLEV_XPOS, MICROLEV_YPOS, MICROLEV_XSIZE, MICROLEV_YSIZE,
-              MICROLEV_XPOS, MICROLEV_YPOS);
-    BlitBitmap(backbuffer, window,
-              SX, MICROLABEL_YPOS, SXSIZE, FONT4_YSIZE,
-              SX, MICROLABEL_YPOS);
+    BlitBitmap(backbuffer, window, SX, SY + 10 * TILEY, SXSIZE, 7 * TILEY,
+              SX, SY + 10 * TILEY);
+
     redraw_mask &= ~REDRAW_MICROLEVEL;
   }
 
@@ -279,7 +278,7 @@ void BackToFront()
       info1[0] = '\0';
 
     sprintf(text, "%.1f fps%s", global.frames_per_second, info1);
-    DrawTextExt(window, SX, SY, text, FS_SMALL, FC_YELLOW, FONT_OPAQUE);
+    DrawTextExt(window, SX, SY, text, FONT_TEXT_2, FONT_OPAQUE);
   }
 
   FlushDisplay();
@@ -367,7 +366,7 @@ void SetMainBackgroundImage(int graphic)
   SetMainBackgroundBitmap(graphic == IMG_UNDEFINED ? NULL :
                          graphic_info[graphic].bitmap ?
                          graphic_info[graphic].bitmap :
-                         graphic_info[IMG_BACKGROUND_DEFAULT].bitmap);
+                         graphic_info[IMG_BACKGROUND].bitmap);
 }
 
 void SetDoorBackgroundImage(int graphic)
@@ -375,7 +374,7 @@ void SetDoorBackgroundImage(int graphic)
   SetDoorBackgroundBitmap(graphic == IMG_UNDEFINED ? NULL :
                          graphic_info[graphic].bitmap ?
                          graphic_info[graphic].bitmap :
-                         graphic_info[IMG_BACKGROUND_DEFAULT].bitmap);
+                         graphic_info[IMG_BACKGROUND].bitmap);
 }
 
 void DrawBackground(int dest_x, int dest_y, int width, int height)
@@ -426,7 +425,7 @@ void SetBorderElement()
   {
     for(x=0; x<lev_fieldx; x++)
     {
-      if (!IS_MASSIVE(Feld[x][y]))
+      if (!IS_INDESTRUCTIBLE(Feld[x][y]))
        BorderElement = EL_STEELWALL;
 
       if (y != 0 && y != lev_fieldy - 1 && x != lev_fieldx - 1)
@@ -437,7 +436,7 @@ void SetBorderElement()
 
 void SetRandomAnimationValue(int x, int y)
 {
-  anim.random_frame = GfxRandom[x][y];
+  gfx.anim_random_frame = GfxRandom[x][y];
 }
 
 inline int getGraphicAnimationFrame(int graphic, int sync_frame)
@@ -543,6 +542,7 @@ void DrawPlayer(struct PlayerInfo *player)
   int graphic;
   int frame = 0;
   boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE);
+  int current_action = ACTION_DEFAULT;
 
   if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy)))
     return;
@@ -560,7 +560,16 @@ void DrawPlayer(struct PlayerInfo *player)
   if (element == EL_EXPLOSION)
     return;
 
-  /* draw things in the field the player is leaving, if needed */
+  current_action = (player->Pushing ? ACTION_PUSHING :
+                   player->is_digging ? ACTION_DIGGING :
+                   player->is_moving ? ACTION_MOVING :
+                   player->snapped ? ACTION_SNAPPING : ACTION_DEFAULT);
+
+  InitPlayerGfxAnimation(player, current_action, player->MovDir);
+
+  /* ----------------------------------------------------------------------- */
+  /* draw things in the field the player is leaving, if needed               */
+  /* ----------------------------------------------------------------------- */
 
   if (player_is_moving)
   {
@@ -568,12 +577,14 @@ void DrawPlayer(struct PlayerInfo *player)
     {
       DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
 
-      if (last_element == EL_DYNAMITE_ACTIVE)
+      if (last_element == EL_DYNAMITE_ACTIVE ||
+         last_element == EL_SP_DISK_RED_ACTIVE)
        DrawDynamite(last_jx, last_jy);
       else
        DrawLevelFieldThruMask(last_jx, last_jy);
     }
-    else if (last_element == EL_DYNAMITE_ACTIVE)
+    else if (last_element == EL_DYNAMITE_ACTIVE ||
+            last_element == EL_SP_DISK_RED_ACTIVE)
       DrawDynamite(last_jx, last_jy);
     else
       DrawLevelField(last_jx, last_jy);
@@ -598,97 +609,94 @@ void DrawPlayer(struct PlayerInfo *player)
   if (setup.direct_draw)
     SetDrawtoField(DRAW_BUFFERED);
 
-  /* draw things behind the player, if needed */
+  /* ----------------------------------------------------------------------- */
+  /* draw things behind the player, if needed                                */
+  /* ----------------------------------------------------------------------- */
 
   if (Store[jx][jy])
     DrawLevelElement(jx, jy, Store[jx][jy]);
-  else if (!IS_ACTIVE_BOMB(element))
-    DrawLevelField(jx, jy);
-  else
+  else if (IS_ACTIVE_BOMB(element))
     DrawLevelElement(jx, jy, EL_EMPTY);
-
-  /* draw player himself */
-
-  if (game.emulation == EMU_SUPAPLEX)
+  else
   {
-    static int last_dir = MV_LEFT;
-    int action = (player->programmed_action ? player->programmed_action :
-                 player->action);
-    boolean action_moving =
-      (player_is_moving ||
-       ((action & (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)) &&
-       !(action & ~(MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN))));
+    if (player_is_moving && GfxElement[jx][jy] != EL_UNDEFINED)
+    {
+      int old_element = GfxElement[jx][jy];
+      int old_graphic =
+       el_act_dir2img(old_element, ACTION_DIGGING, player->MovDir);
+      int frame = getGraphicAnimationFrame(old_graphic, player->StepFrame);
 
-    graphic = IMG_SP_MURPHY;
+#if 0
+      Bitmap *src_bitmap;
+      int src_x, src_y;
+      int width = TILEX, height = TILEY;
+      int cx = 0, cy = 0;
 
-    if (player->Pushing)
-    {
-      if (player->MovDir == MV_LEFT)
-       graphic = IMG_SP_MURPHY_PUSHING_LEFT;
-      else if (player->MovDir == MV_RIGHT)
-       graphic = IMG_SP_MURPHY_PUSHING_RIGHT;
-      else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_LEFT)
-       graphic = IMG_SP_MURPHY_PUSHING_LEFT;
-      else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT)
-       graphic = IMG_SP_MURPHY_PUSHING_RIGHT;
-    }
-    else if (player->snapped)
-    {
-      if (player->MovDir == MV_LEFT)
-       graphic = IMG_SP_MURPHY_SNAPPING_LEFT;
-      else if (player->MovDir == MV_RIGHT)
-       graphic = IMG_SP_MURPHY_SNAPPING_RIGHT;
-      else if (player->MovDir == MV_UP)
-       graphic = IMG_SP_MURPHY_SNAPPING_UP;
+      if (player->MovDir == MV_UP)
+      {
+       cy = player->GfxPos;
+       height -= cy;
+      }
       else if (player->MovDir == MV_DOWN)
-       graphic = IMG_SP_MURPHY_SNAPPING_DOWN;
+      {
+       cy = 0;
+       height = TILEY - player->GfxPos;
+      }
+      else if (player->MovDir == MV_LEFT)
+      {
+       cx = player->GfxPos;
+       width -= cx;
+      }
+      else if (player->MovDir == MV_RIGHT)
+      {
+       cx = 0;
+       width = TILEX - player->GfxPos;
+      }
+
+      getGraphicSource(old_graphic, frame, &src_bitmap, &src_x, &src_y);
+
+      BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy,
+                width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy);
+#else
+#if 0
+      printf("::: %d, %d, %d, %d => %d, %d [%d, %d, %d]\n",
+            old_element, ACTION_DIGGING, player->MovDir, player->Frame,
+            old_graphic, frame,
+            player->MovPos, player->GfxPos, player->StepFrame);
+#endif
+
+      DrawGraphic(sx, sy, old_graphic, frame);
+#endif
     }
-    else if (action_moving)
+    else
     {
-      if (player->MovDir == MV_LEFT)
-       graphic = IMG_SP_MURPHY_MOVING_LEFT;
-      else if (player->MovDir == MV_RIGHT)
-       graphic = IMG_SP_MURPHY_MOVING_RIGHT;
-      else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_LEFT)
-       graphic = IMG_SP_MURPHY_MOVING_LEFT;
-      else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT)
-       graphic = IMG_SP_MURPHY_MOVING_RIGHT;
-      else
-       graphic = IMG_SP_MURPHY_MOVING_LEFT;
+      GfxElement[jx][jy] = EL_UNDEFINED;
 
-      frame = getGraphicAnimationFrame(graphic, -1);
+      DrawLevelField(jx, jy);
     }
+  }
+
+  /* ----------------------------------------------------------------------- */
+  /* draw player himself                                                     */
+  /* ----------------------------------------------------------------------- */
+
+  if (player->use_murphy_graphic)
+  {
+    static int last_horizontal_dir = MV_LEFT;
+    int direction;
 
     if (player->MovDir == MV_LEFT || player->MovDir == MV_RIGHT)
-      last_dir = player->MovDir;
+      last_horizontal_dir = player->MovDir;
+
+    direction = (player->snapped ? player->MovDir : last_horizontal_dir);
+
+    graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction);
   }
   else
-  {
-    if (player->MovDir == MV_LEFT)
-      graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_LEFT :
-                player->is_moving ? IMG_PLAYER1_MOVING_LEFT :
-                IMG_PLAYER1_LEFT);
-    else if (player->MovDir == MV_RIGHT)
-      graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_RIGHT :
-                player->is_moving ? IMG_PLAYER1_MOVING_RIGHT :
-                IMG_PLAYER1_RIGHT);
-    else if (player->MovDir == MV_UP)
-      graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_UP :
-                player->is_moving ? IMG_PLAYER1_MOVING_UP :
-                IMG_PLAYER1_UP);
-    else       /* MV_DOWN || MV_NO_MOVING */
-      graphic = (player->Pushing ? IMG_PLAYER1_PUSHING_DOWN :
-                player->is_moving ? IMG_PLAYER1_MOVING_DOWN :
-                IMG_PLAYER1_DOWN);
-
-    graphic = PLAYER_NR_GFX(graphic, player->index_nr);
+    graphic = el_act_dir2img(player->element_nr, player->GfxAction,
+                            player->MovDir);
 
-#if 0
-    frame = player->Frame;
-#else
-    frame = getGraphicAnimationFrame(graphic, player->Frame);
-#endif
-  }
+  frame = getGraphicAnimationFrame(graphic, player->Frame);
 
   if (player->GfxPos)
   {
@@ -701,11 +709,6 @@ void DrawPlayer(struct PlayerInfo *player)
   if (!setup.soft_scrolling && ScreenMovPos)
     sxx = syy = 0;
 
-#if 0
-  if (player->Frame)
-    printf("-> %d\n", player->Frame);
-#endif
-
   DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING);
 
   if (SHIELD_ON(player))
@@ -717,11 +720,11 @@ void DrawPlayer(struct PlayerInfo *player)
     DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING);
   }
 
-#if 0
-  if (player->Pushing && player->GfxPos)
-#else
+  /* ----------------------------------------------------------------------- */
+  /* draw things the player is pushing, if needed                            */
+  /* ----------------------------------------------------------------------- */
+
   if (player->Pushing && player_is_moving)
-#endif
   {
     int px = SCREENX(next_jx), py = SCREENY(next_jy);
 
@@ -734,35 +737,12 @@ void DrawPlayer(struct PlayerInfo *player)
     {
       int element = Feld[next_jx][next_jy];
       int graphic = el2img(element);
-#if 1
       int frame = 0;
-#endif
 
       if ((sxx || syy) && IS_PUSHABLE(element))
       {
        graphic = el_act_dir2img(element, ACTION_MOVING, player->MovDir);
-#if 1
-       frame = getGraphicAnimationFrame(graphic, player->GfxPos);
-
        frame = getGraphicAnimationFrame(graphic, player->Frame);
-#endif
-
-#if 0
-       printf("-> %d [%d]\n", player->Frame, player->GfxPos);
-#endif
-
-#if 0
-       /* !!! FIX !!! */
-       if (player->MovDir == MV_LEFT)
-         frame = 3 - frame;
-#endif
-
-#if 0
-       frame = (player->GfxPos / (TILEX / 4));
-
-       if (player->MovDir == MV_RIGHT)
-         frame = (frame + 4) % 4;
-#endif
       }
 
       DrawGraphicShifted(px, py, sxx, syy, graphic, frame,
@@ -770,32 +750,14 @@ void DrawPlayer(struct PlayerInfo *player)
     }
   }
 
-  /* draw things in front of player (active dynamite or dynabombs) */
+  /* ----------------------------------------------------------------------- */
+  /* draw things in front of player (active dynamite or dynabombs)           */
+  /* ----------------------------------------------------------------------- */
 
   if (IS_ACTIVE_BOMB(element))
   {
     graphic = el2img(element);
-
-#if 0
-    if (element == EL_DYNAMITE_ACTIVE)
-    {
-      if ((frame = (96 - MovDelay[jx][jy]) / 12) > 6)
-       frame = 6;
-    }
-    else
-    {
-      if ((frame = ((96 - MovDelay[jx][jy]) / 6) % 8) > 3)
-       frame = 7 - frame;
-    }
-#else
-
-#if 0
-    frame = getGraphicAnimationFrame(graphic, 96 - MovDelay[jx][jy]);
-#else
     frame = getGraphicAnimationFrame(graphic, GfxFrame[jx][jy]);
-#endif
-
-#endif
 
     if (game.emulation == EMU_SUPAPLEX)
       DrawGraphic(sx, sy, IMG_SP_DISK_RED, frame);
@@ -817,7 +779,10 @@ void DrawPlayer(struct PlayerInfo *player)
       DrawGraphicThruMask(SCREENX(last_jx), SCREENY(last_jy), graphic, frame);
   }
 
-  /* draw elements that stay over the player */
+  /* ----------------------------------------------------------------------- */
+  /* draw elements that stay over the player                                 */
+  /* ----------------------------------------------------------------------- */
+
   /* handle the field the player is leaving ... */
   if (player_is_moving && IS_OVER_PLAYER(last_element))
     DrawLevelField(last_jx, last_jy);
@@ -959,16 +924,22 @@ void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y)
   int src_x = mini_startx + graphic_info[graphic].src_x / 2;
   int src_y = mini_starty + graphic_info[graphic].src_y / 2;
 
+#if 0
+  /* !!! not needed anymore, because of automatically created mini graphics */
   if (src_x + MINI_TILEX > src_bitmap->width ||
       src_y + MINI_TILEY > src_bitmap->height)
   {
     /* graphic of desired size seems not to be contained in this image;
        dirty workaround: get it from the middle of the normal sized image */
 
+    printf("::: using dirty workaround for %d (%d, %d)\n",
+          graphic, src_bitmap->width, src_bitmap->height);
+
     getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y);
     src_x += (TILEX / 2 - MINI_TILEX / 2);
     src_y += (TILEY / 2 - MINI_TILEY / 2);
   }
+#endif
 
   *bitmap = src_bitmap;
   *x = src_x;
@@ -1133,7 +1104,7 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
     frame = getGraphicAnimationFrame(graphic, -1);
   }
 
-  if (element == EL_WALL_GROWING)
+  if (element == EL_EXPANDABLE_WALL)
   {
     boolean left_stopped = FALSE, right_stopped = FALSE;
 
@@ -1146,16 +1117,17 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
       graphic = IMG_WALL;
     else if (left_stopped)
     {
-      graphic = IMG_WALL_GROWING_ACTIVE_RIGHT;
+      graphic = IMG_EXPANDABLE_WALL_GROWING_RIGHT;
       frame = graphic_info[graphic].anim_frames - 1;
     }
     else if (right_stopped)
     {
-      graphic = IMG_WALL_GROWING_ACTIVE_LEFT;
+      graphic = IMG_EXPANDABLE_WALL_GROWING_LEFT;
       frame = graphic_info[graphic].anim_frames - 1;
     }
   }
-  else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING)
+#if 0
+  else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DROPPING)
   {
     graphic = (element == EL_BD_AMOEBA ? IMG_BD_AMOEBA_PART1 :
               element == EL_AMOEBA_WET ? IMG_AMOEBA_WET_PART1 :
@@ -1165,6 +1137,16 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
 
     graphic += (x + 2 * y + 4) % 4;
   }
+#endif
+
+#if 0
+  if (IS_AMOEBOID(element) || element == EL_AMOEBA_DROPPING)
+  {
+    if (Feld[lx][ly] == EL_AMOEBA_DROPPING)
+      printf("---> %d -> %d / %d [%d]\n",
+            element, graphic, frame, GfxRandom[lx][ly]);
+  }
+#endif
 
   if (dx || dy)
     DrawGraphicShifted(x, y, dx, dy, graphic, frame, cut_mode, mask_mode);
@@ -1238,6 +1220,9 @@ void DrawCrumbledSand(int x, int y)
   element = Feld[lx][ly];
 
   if (element == EL_SAND ||
+#if 1
+      (element == EL_EMPTY_SPACE && GfxElement[lx][ly] == EL_SAND) ||
+#endif
       element == EL_LANDMINE ||
       element == EL_TRAP ||
       element == EL_TRAP_ACTIVE)
@@ -1263,6 +1248,9 @@ void DrawCrumbledSand(int x, int y)
        element = Feld[lxx][lyy];
 
       if (element == EL_SAND ||
+#if 1
+         (element == EL_EMPTY_SPACE && GfxElement[lxx][lyy] == EL_SAND) ||
+#endif
          element == EL_LANDMINE ||
          element == EL_TRAP ||
          element == EL_TRAP_ACTIVE)
@@ -1308,6 +1296,9 @@ void DrawCrumbledSand(int x, int y)
 
       if (!IN_LEV_FIELD(lxx, lyy) ||
          (Feld[lxx][lyy] != EL_SAND &&
+#if 1
+          !(Feld[lxx][lyy] == EL_EMPTY_SPACE && GfxElement[lxx][lyy] == EL_SAND) &&
+#endif
           Feld[lxx][lyy] != EL_LANDMINE &&
           Feld[lxx][lyy] != EL_TRAP &&
           Feld[lxx][lyy] != EL_TRAP_ACTIVE) ||
@@ -1399,7 +1390,7 @@ void DrawScreenField(int x, int y)
     if (element == EL_QUICKSAND_EMPTYING ||
        element == EL_MAGIC_WALL_EMPTYING ||
        element == EL_BD_MAGIC_WALL_EMPTYING ||
-       element == EL_AMOEBA_DRIPPING)
+       element == EL_AMOEBA_DROPPING)
       cut_mode = CUT_ABOVE;
     else if (element == EL_QUICKSAND_FILLING ||
             element == EL_MAGIC_WALL_FILLING ||
@@ -1441,7 +1432,7 @@ void DrawScreenField(int x, int y)
     if (element_old == EL_QUICKSAND_EMPTYING ||
        element_old == EL_MAGIC_WALL_EMPTYING ||
        element_old == EL_BD_MAGIC_WALL_EMPTYING ||
-       element_old == EL_AMOEBA_DRIPPING)
+       element_old == EL_AMOEBA_DROPPING)
       cut_mode = CUT_ABOVE;
 
     DrawScreenElement(x, y, EL_EMPTY);
@@ -1604,13 +1595,18 @@ static void DrawMicroLevelExt(int xpos, int ypos, int from_x, int from_y)
 #define MICROLABEL_IMPORTED_FROM       4
 #define MICROLABEL_LEVEL_IMPORT_INFO   5
 
-#define MAX_MICROLABEL_SIZE            (SXSIZE / FONT4_XSIZE)
-
 static void DrawMicroLevelLabelExt(int mode)
 {
-  char label_text[MAX_MICROLABEL_SIZE + 1];
+  char label_text[MAX_OUTPUT_LINESIZE + 1];
+  int max_len_label_text;
+  int font_nr = FONT_TEXT_2;
+
+  if (mode == MICROLABEL_CREATED_BY || mode == MICROLABEL_IMPORTED_FROM)
+    font_nr = FONT_TEXT_3;
 
-  DrawBackground(SX, MICROLABEL_YPOS, SXSIZE, FONT4_YSIZE);
+  max_len_label_text = SXSIZE / getFontWidth(font_nr);
+
+  DrawBackground(SX, MICROLABEL_YPOS, SXSIZE, getFontHeight(font_nr));
 
   strncpy(label_text, (mode == MICROLABEL_LEVEL_NAME ? level.name :
                       mode == MICROLABEL_CREATED_BY ? "created by" :
@@ -1618,15 +1614,16 @@ static void DrawMicroLevelLabelExt(int mode)
                       mode == MICROLABEL_IMPORTED_FROM ? "imported from" :
                       mode == MICROLABEL_LEVEL_IMPORT_INFO ?
                       leveldir_current->imported_from : ""),
-         MAX_MICROLABEL_SIZE);
-  label_text[MAX_MICROLABEL_SIZE] = '\0';
+         max_len_label_text);
+  label_text[max_len_label_text] = '\0';
 
   if (strlen(label_text) > 0)
   {
-    int lxpos = SX + (SXSIZE - strlen(label_text) * FONT4_XSIZE) / 2;
+    int text_width = strlen(label_text) * getFontWidth(font_nr);
+    int lxpos = SX + (SXSIZE - text_width) / 2;
     int lypos = MICROLABEL_YPOS;
 
-    DrawText(lxpos, lypos, label_text, FS_SMALL, FC_SPECIAL2);
+    DrawText(lxpos, lypos, label_text, font_nr);
   }
 
   redraw_mask |= REDRAW_MICROLEVEL;
@@ -1638,6 +1635,9 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
   static unsigned long label_delay = 0;
   static int from_x, from_y, scroll_direction;
   static int label_state, label_counter;
+  int last_game_status = game_status;  /* save current game status */
+
+  game_status = PSEUDO_PREVIEW;        /* force PREVIEW font on preview level */
 
   if (restart)
   {
@@ -1653,6 +1653,17 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
     DelayReached(&scroll_delay, 0);
     DelayReached(&label_delay, 0);
 
+    if (leveldir_current->name)
+    {
+      int len = strlen(leveldir_current->name);
+      int lxpos = SX + (SXSIZE - len * getFontWidth(FONT_TEXT_1)) / 2;
+      int lypos = SY + 352;
+
+      DrawText(lxpos, lypos, leveldir_current->name, FONT_TEXT_1);
+    }
+
+    game_status = last_game_status;    /* restore current game status */
+
     return;
   }
 
@@ -1721,6 +1732,8 @@ void DrawMicroLevel(int xpos, int ypos, boolean restart)
                   MICROLABEL_LEVEL_IMPORT_INFO : MICROLABEL_EMPTY);
     DrawMicroLevelLabelExt(label_state);
   }
+
+  game_status = last_game_status;      /* restore current game status */
 }
 
 int REQ_in_range(int x, int y)
@@ -1742,6 +1755,7 @@ boolean Request(char *text, unsigned int req_state)
 {
   int mx, my, ty, result = -1;
   unsigned int old_door_state;
+  int last_game_status = game_status;  /* save current game status */
 
 #if defined(PLATFORM_UNIX)
   /* pause network game while waiting for request to answer */
@@ -1767,6 +1781,8 @@ boolean Request(char *text, unsigned int req_state)
   /* clear door drawing field */
   DrawBackground(DX, DY, DXSIZE, DYSIZE);
 
+  game_status = PSEUDO_DOOR;   /* force DOOR font on preview level */
+
   /* write text for request */
   for(ty=0; ty < MAX_REQUEST_LINES; ty++)
   {
@@ -1793,12 +1809,15 @@ boolean Request(char *text, unsigned int req_state)
     strncpy(text_line, text, tl);
     text_line[tl] = 0;
 
-    DrawText(DX + 50 - (tl * 14)/2, DY + 8 + ty * 16,
-            text_line, FS_SMALL, FC_YELLOW);
+    DrawText(DX + (DXSIZE - tl * getFontWidth(FONT_TEXT_2)) / 2,
+            DY + 8 + ty * (getFontHeight(FONT_TEXT_2) + 2),
+            text_line, FONT_TEXT_2);
 
     text += tl + (tc == ' ' ? 1 : 0);
   }
 
+  game_status = last_game_status;      /* restore current game status */
+
   if (req_state & REQ_ASK)
   {
     MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
@@ -2362,7 +2381,7 @@ void CreateToolButtons()
     {
       int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
 
-      getMiniGraphicSource(PLAYER_NR_GFX(IMG_PLAYER1, player_nr),
+      getMiniGraphicSource(PLAYER_NR_GFX(IMG_PLAYER_1, player_nr),
                           &deco_bitmap, &deco_x, &deco_y);
       deco_xpos = (toolbutton_info[i].width - MINI_TILEX) / 2;
       deco_ypos = (toolbutton_info[i].height - MINI_TILEY) / 2;
@@ -2424,7 +2443,7 @@ int get_next_element(int element)
     case EL_MAGIC_WALL_EMPTYING:       return EL_MAGIC_WALL_ACTIVE;
     case EL_BD_MAGIC_WALL_FILLING:     return EL_BD_MAGIC_WALL_FULL;
     case EL_BD_MAGIC_WALL_EMPTYING:    return EL_BD_MAGIC_WALL_ACTIVE;
-    case EL_AMOEBA_DRIPPING:           return EL_AMOEBA_WET;
+    case EL_AMOEBA_DROPPING:           return EL_AMOEBA_WET;
 
     default:                           return element;
   }
@@ -2454,10 +2473,10 @@ int el2img(int element)
 
 int el2edimg(int element)
 {
-  return element_info[element].editor_graphic;
+  return element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR];
 }
 
 int el2preimg(int element)
 {
-  return element_info[element].preview_graphic;
+  return element_info[element].special_graphic[GFX_SPECIAL_ARG_PREVIEW];
 }