rnd-19991002-1-src
[rocksndiamonds.git] / src / tools.c
index fbd0ca17d7da66db7838717432ca6206eb17ee35..b2815d94539d92823baa700818d5afcf53771c37 100644 (file)
@@ -319,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 :
@@ -328,12 +329,24 @@ 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)
+{
+  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);
+  }
+}
+
 void DrawTextFCentered(int y, int font_type, char *format, ...)
 {
   char buffer[FULL_SXSIZE / FONT5_XSIZE + 10];
@@ -377,7 +390,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;
@@ -385,8 +398,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)
@@ -784,6 +801,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;
@@ -1135,6 +1159,10 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
   {
     graphic += !phase2;
   }
+  else if (element == EL_BALLOON)
+  {
+    graphic += phase4;
+  }
   else if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK ||
            IS_GEM(element)) && !cut_mode)
   {
@@ -1609,7 +1637,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';
 
@@ -1692,12 +1720,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;
@@ -2568,6 +2596,24 @@ int el2gfx(int element)
     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;
 
     default:
     {