rnd-20070312-1-src
[rocksndiamonds.git] / src / init.c
index 4e715dff4ab4c80abc3e19cc4cfc1cf35d6c9ab7..57c03bd0ab3060a5160435c13259012377558537 100644 (file)
@@ -238,12 +238,25 @@ void InitFontGraphicInfo()
        getImageListEntryFromImageID(base_graphic)->redefined;
       boolean special_redefined =
        getImageListEntryFromImageID(graphic)->redefined;
+      boolean special_cloned = (graphic_info[graphic].clone_from != -1);
+
+#if 0
+      printf("::: %d, %d, %d / %d, %d, %d\n",
+            font_nr, special, graphic,
+            base_redefined, special_redefined, special_cloned);
+#endif
+
+#if 0
+      // special_cloned = 0;
+#endif
 
       /* if the base font ("font.title_1", for example) has been redefined,
         but not the special font ("font.title_1.LEVELS", for example), do not
         use an existing (in this case considered obsolete) special font
         anymore, but use the automatically determined default font */
-      if (base_redefined && !special_redefined)
+      /* special case: cloned special fonts must be explicitly redefined,
+        but are not automatically redefined by redefining base font */
+      if (base_redefined && !special_redefined && !special_cloned)
        continue;
 
       font_info[font_nr].special_graphic[special] = graphic;
@@ -270,6 +283,87 @@ void InitFontGraphicInfo()
     }
   }
 
+#if 0
+  printf("-0- T3.P: %d, %d\n",
+        font_info[FONT_TEXT_3].special_graphic[GFX_SPECIAL_ARG_PREVIEW],
+        font_info[FONT_TEXT_3].special_bitmap_id[GFX_SPECIAL_ARG_PREVIEW]);
+
+  printf("-0- T4.M: %d, %d\n",
+        font_info[FONT_TEXT_4].special_graphic[GFX_SPECIAL_ARG_MAIN],
+        font_info[FONT_TEXT_4].special_bitmap_id[GFX_SPECIAL_ARG_MAIN]);
+#endif
+
+#if 1
+  /* correct special font/graphic mapping for cloned fonts
+     (per definition only needed for static configuration) */
+  for (i = 0; font_to_graphic[i].font_nr > -1; i++)
+  {
+    int font_nr      = font_to_graphic[i].font_nr;
+    int special      = font_to_graphic[i].special;
+    int graphic      = font_to_graphic[i].graphic;
+#if 0
+    int base_graphic = font2baseimg(font_nr);
+#endif
+
+    if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS)
+    {
+#if 0
+      boolean base_redefined =
+       getImageListEntryFromImageID(base_graphic)->redefined;
+#endif
+      boolean special_redefined =
+       getImageListEntryFromImageID(graphic)->redefined;
+      boolean special_cloned = (graphic_info[graphic].clone_from != -1);
+
+      if (special_cloned && !special_redefined)
+      {
+       int j;
+
+#if 0
+       printf(":2: %d, %d, %d / %d, %d, %d\n",
+              font_nr, special, graphic,
+              base_redefined, special_redefined, special_cloned);
+#endif
+
+       for (j = 0; font_to_graphic[j].font_nr > -1; j++)
+       {
+         int font_nr2      = font_to_graphic[j].font_nr;
+         int special2      = font_to_graphic[j].special;
+         int graphic2      = font_to_graphic[j].graphic;
+#if 0
+         int base_graphic2 = font2baseimg(font_nr2);
+#endif
+
+         if (graphic2 == graphic_info[graphic].clone_from)
+         {
+#if 0
+           printf(":2.1: %d, %d, %d, %d\n",
+                  font_nr2, special2, graphic2, base_graphic2);
+#endif
+
+#if 1
+           font_info[font_nr].special_graphic[special] =
+             font_info[font_nr2].special_graphic[special2];
+           font_info[font_nr].special_bitmap_id[special] =
+             font_info[font_nr2].special_bitmap_id[special2];
+#else
+#if 1
+           font_info[font_nr].special_graphic[special] = graphic2;
+           font_info[font_nr].special_bitmap_id[special] =
+             font_info[font_nr2].special_bitmap_id[special2];
+#else
+           font_info[font_nr].special_graphic[special] = graphic2;
+           font_info[font_nr].special_bitmap_id[special] = num_font_bitmaps;
+           num_font_bitmaps++;
+#endif
+#endif
+         }
+       }
+      }
+    }
+  }
+#endif
+
   /* reset non-redefined ".active" font graphics if normal font is redefined */
   /* (this different treatment is needed because normal and active fonts are
      independently defined ("active" is not a property of font definitions!) */
@@ -318,6 +412,24 @@ void InitFontGraphicInfo()
     }
   }
 
+#if 0
+  printf("-1- T4.M: %d, %d\n",
+        font_info[FONT_TEXT_4].special_graphic[GFX_SPECIAL_ARG_MAIN],
+        font_info[FONT_TEXT_4].special_bitmap_id[GFX_SPECIAL_ARG_MAIN]);
+
+  font_info[FONT_TEXT_4].special_graphic[GFX_SPECIAL_ARG_MAIN] =
+    IMG_FONT_TEXT_3;
+  font_info[FONT_TEXT_4].special_bitmap_id[GFX_SPECIAL_ARG_MAIN] =
+    FONT_TEXT_3;
+
+#if 0
+  font_info[FONT_TEXT_4].special_graphic[GFX_SPECIAL_ARG_MAIN] =
+    IMG_FONT_TEXT_3_PREVIEW;
+  font_info[FONT_TEXT_4].special_bitmap_id[GFX_SPECIAL_ARG_MAIN] =
+    FONT_TEXT_3;
+#endif
+#endif
+
   /* ---------- initialize font bitmap array ---------- */
 
   if (font_bitmap_info != NULL)
@@ -368,6 +480,16 @@ void InitFontGraphicInfo()
   }
 
   InitFontInfo(font_bitmap_info, num_font_bitmaps, getFontBitmapID);
+
+#if 0
+  printf("-X- T3.P: %d, %d\n",
+        font_info[FONT_TEXT_3].special_graphic[GFX_SPECIAL_ARG_PREVIEW],
+        font_info[FONT_TEXT_3].special_bitmap_id[GFX_SPECIAL_ARG_PREVIEW]);
+
+  printf("-4- T4.M: %d, %d\n",
+        font_info[FONT_TEXT_4].special_graphic[GFX_SPECIAL_ARG_MAIN],
+        font_info[FONT_TEXT_4].special_bitmap_id[GFX_SPECIAL_ARG_MAIN]);
+#endif
 }
 
 void InitElementGraphicInfo()
@@ -1965,7 +2087,7 @@ boolean getBitfieldProperty(int *bitfield, int property_bit_nr, int element)
   return FALSE;
 }
 
-static void resolve_group_element(int group_element, int recursion_depth)
+static void ResolveGroupElementExt(int group_element, int recursion_depth)
 {
   static int group_nr;
   static struct ElementGroupInfo *group;
@@ -1989,10 +2111,13 @@ static void resolve_group_element(int group_element, int recursion_depth)
   if (recursion_depth == 0)                    /* initialization */
   {
     group = actual_group;
-    group_nr = group_element - EL_GROUP_START;
+    group_nr = GROUP_NR(group_element);
 
     group->num_elements_resolved = 0;
     group->choice_pos = 0;
+
+    for (i = 0; i < MAX_NUM_ELEMENTS; i++)
+      element_info[i].in_group[group_nr] = FALSE;
   }
 
   for (i = 0; i < actual_group->num_elements; i++)
@@ -2003,7 +2128,7 @@ static void resolve_group_element(int group_element, int recursion_depth)
       break;
 
     if (IS_GROUP_ELEMENT(element))
-      resolve_group_element(element, recursion_depth + 1);
+      ResolveGroupElementExt(element, recursion_depth + 1);
     else
     {
       group->element_resolved[group->num_elements_resolved++] = element;
@@ -2012,6 +2137,11 @@ static void resolve_group_element(int group_element, int recursion_depth)
   }
 }
 
+void ResolveGroupElement(int group_element)
+{
+  ResolveGroupElementExt(group_element, 0);
+}
+
 void InitElementPropertiesStatic()
 {
   static int ep_diggable[] =
@@ -4023,14 +4153,9 @@ void InitElementPropertiesEngine(int engine_version)
      property (which means that conditional property changes must be set to
      a reliable default value before) */
 
-  /* ---------- recursively resolve group elements ------------------------- */
-
-  for (i = 0; i < MAX_NUM_ELEMENTS; i++)
-    for (j = 0; j < NUM_GROUP_ELEMENTS; j++)
-      element_info[i].in_group[j] = FALSE;
-
+  /* resolve group elements */
   for (i = 0; i < NUM_GROUP_ELEMENTS; i++)
-    resolve_group_element(EL_GROUP_START + i, 0);
+    ResolveGroupElement(EL_GROUP_START + i);
 
   /* set all special, combined or engine dependent element properties */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)