rnd-20030208-2-src
[rocksndiamonds.git] / src / init.c
index f6985eb9068dab43102081c268d32b416e043ff8..5a97a827c04b233c654bc8febe8f56caa9ebd07c 100644 (file)
 #include "conf_esg.c"  /* include auto-generated data structure definitions */
 
 
-static char *image_filename[NUM_PICTURES] =
-{
-#if 0
-  "RocksScreen.pcx",
-  "RocksDoor.pcx",
-  "RocksToons.pcx",
-  "RocksFontBig.pcx",
-  "RocksFontSmall.pcx",
-  "RocksFontMedium.pcx",
-  "RocksFontEM.pcx"
-#else
-  "RocksScreen.pcx",
-  "RocksElements.pcx",
-  "RocksDoor.pcx",
-  "RocksHeroes.pcx",
-  "RocksToons.pcx",
-  "RocksSP.pcx",
-  "RocksDC.pcx",
-  "RocksMore.pcx",
-  "RocksFontBig.pcx",
-  "RocksFontSmall.pcx",
-  "RocksFontMedium.pcx",
-  "RocksFontEM.pcx"
-#endif
-}; 
-
 static Bitmap *bitmap_font_initial = NULL;
 
 static void InitGlobal();
@@ -477,9 +451,17 @@ void FreeTileClipmasks()
 
 void InitGfx()
 {
-#if 0
+  char *config_token_font_initial = "font.small";
+  char *filename_font_initial = NULL;
   int i;
-#endif
+
+  /* determine filename for initial font (for displaying startup messages) */
+  for (i=0; image_config[i].token != NULL; i++)
+    if (strcmp(image_config[i].token, config_token_font_initial) == 0)
+      filename_font_initial = image_config[i].value;
+
+  if (filename_font_initial == NULL)   /* should not happen */
+    Error(ERR_EXIT, "cannot get filename for '%s'", config_token_font_initial);
 
   /* initialize screen properties */
   InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
@@ -492,40 +474,15 @@ void InitGfx()
   bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH);
   bitmap_db_door  = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH);
 
-#if 0
-  pix[PIX_FONT_SMALL] = LoadCustomImage(image_filename[PIX_FONT_SMALL]);
-
-  InitFontInfo(NULL, NULL, pix[PIX_FONT_SMALL], NULL);
-#else
-  bitmap_font_initial = LoadCustomImage(image_filename[PIX_FONT_SMALL]);
+  bitmap_font_initial = LoadCustomImage(filename_font_initial);
 
   InitFontInfo(bitmap_font_initial, NULL, NULL, NULL, NULL);
-#endif
 
   DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
   DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
 
   DrawInitText("Loading graphics:", 120, FC_GREEN);
 
-#if 0
-  for (i=0; i<NUM_PICTURES; i++)
-  {
-#if 0
-    if (i != PIX_FONT_SMALL)
-#endif
-    {
-      DrawInitText(image_filename[i], 150, FC_YELLOW);
-
-      pix[i] = LoadCustomImage(image_filename[i]);
-    }
-  }
-#endif
-
-#if 0
-  InitFontInfo(pix[PIX_FONT_BIG], pix[PIX_FONT_MEDIUM], pix[PIX_FONT_SMALL],
-              pix[PIX_FONT_EM]);
-#endif
-
   InitTileClipmasks();
 }
 
@@ -752,6 +709,7 @@ void InitElementGraphicInfo()
     }
   }
 
+#if 0
   for (i=EL_CHAR_START; i<=EL_CHAR_END; i++)
     element_info[i].graphic[ACTION_DEFAULT] =
       IMG_CHAR_START + (i - EL_CHAR_START);
@@ -759,6 +717,7 @@ void InitElementGraphicInfo()
   for (i=EL_CUSTOM_START; i<=EL_CUSTOM_END; i++)
     element_info[i].graphic[ACTION_DEFAULT] =
       IMG_CUSTOM_START + (i - EL_CUSTOM_START);
+#endif
 
   /* initialize normal element/graphic mapping from static configuration */
   for (i=0; element_to_graphic[i].element > -1; i++)
@@ -837,7 +796,7 @@ void InitElementGraphicInfo()
     }
   }
 
-#if 0
+#if 1
 #if DEBUG
   if (options.verbose)
   {
@@ -870,6 +829,11 @@ void InitElementSpecialGraphicInfo()
     int element = element_to_special_graphic[i].element;
     int special = element_to_special_graphic[i].special;
     int graphic = element_to_special_graphic[i].graphic;
+    boolean base_redefined = getImageListEntry(el2img(element))->redefined;
+    boolean special_redefined = getImageListEntry(graphic)->redefined;
+
+    if (base_redefined && !special_redefined)
+      continue;
 
     if (special == GFX_SPECIAL_ARG_EDITOR)
       element_info[element].editor_graphic = graphic;
@@ -896,24 +860,61 @@ static void InitElementSoundInfo()
   /* soon to come */
 }
 
-static void set_graphic_parameters(int graphic, int *parameter)
+static void set_graphic_parameters(int graphic, char **parameter_raw)
 {
   Bitmap *src_bitmap = getBitmapFromImageID(graphic);
   int num_xtiles = (src_bitmap ? src_bitmap->width          : TILEX) / TILEX;
   int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY;
+  int parameter[NUM_GFX_ARGS];
+  int i;
 
-  graphic_info[graphic].bitmap = src_bitmap;
+  /* get integer values from string parameters */
+  for (i=0; i < NUM_GFX_ARGS; i++)
+    parameter[i] =
+      get_parameter_value(image_config_suffix[i].type, parameter_raw[i]);
 
-  graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX;
-  graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY;
-  graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET];
-  graphic_info[graphic].offset_y = 0;
+  graphic_info[graphic].bitmap = src_bitmap;
 
-  /* animation frames are ordered vertically instead of horizontally */
-  if (parameter[GFX_ARG_VERTICAL])
+  /* start with reliable default values */
+  graphic_info[graphic].src_x = 0;
+  graphic_info[graphic].src_y = 0;
+  graphic_info[graphic].width = TILEX;
+  graphic_info[graphic].height = TILEY;
+  graphic_info[graphic].offset_x = 0;  /* one or both of these values ... */
+  graphic_info[graphic].offset_y = 0;  /* ... will be corrected later */
+
+  /* optional x and y tile position of animation frame sequence */
+  if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX;
+  if (parameter[GFX_ARG_YPOS] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY;
+
+  /* optional x and y pixel position of animation frame sequence */
+  if (parameter[GFX_ARG_X] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].src_x = parameter[GFX_ARG_X];
+  if (parameter[GFX_ARG_Y] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].src_y = parameter[GFX_ARG_Y];
+
+  /* optional width and height of each animation frame */
+  if (parameter[GFX_ARG_WIDTH] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].width = parameter[GFX_ARG_WIDTH];
+  if (parameter[GFX_ARG_HEIGHT] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].height = parameter[GFX_ARG_HEIGHT];
+
+  /* correct x or y offset dependant of vertical or horizontal frame order */
+  if (parameter[GFX_ARG_VERTICAL])     /* frames are ordered vertically */
+  {
+    if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE)
+      graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET];
+    else
+      graphic_info[graphic].offset_y = graphic_info[graphic].height;
+  }
+  else                                 /* frames are ordered horizontally */
   {
-    graphic_info[graphic].offset_x = 0;
-    graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET];
+    if (parameter[GFX_ARG_OFFSET] != ARG_UNDEFINED_VALUE)
+      graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET];
+    else
+      graphic_info[graphic].offset_x = graphic_info[graphic].width;
   }
 
   /* optionally, the x and y offset of frames can be specified directly */
@@ -967,11 +968,18 @@ static void set_graphic_parameters(int graphic, int *parameter)
 
   /* animation synchronized with global frame counter, not move position */
   graphic_info[graphic].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC];
+
+  /* this is only used for toon animations */
+  graphic_info[graphic].step_offset = parameter[GFX_ARG_STEP_OFFSET];
+  graphic_info[graphic].step_delay  = parameter[GFX_ARG_STEP_DELAY];
 }
 
 static void InitGraphicInfo()
 {
   static boolean clipmasks_initialized = FALSE;
+  int fallback_graphic = IMG_CHAR_EXCLAM;
+  struct FileInfo *fallback_image = getImageListEntry(fallback_graphic);
+  Bitmap *fallback_bitmap = getBitmapFromImageID(fallback_graphic);
   int num_images = getImageListSize();
   int i;
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
@@ -1034,9 +1042,15 @@ static void InitGraphicInfo()
            "error: first animation frame out of bounds (%d, %d)",
            src_x, src_y);
       Error(ERR_RETURN, "custom graphic rejected for this element/action");
+
+      if (i == fallback_graphic)
+       Error(ERR_EXIT, "fatal error: no fallback graphic available");
+
+      Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic");
       Error(ERR_RETURN_LINE, "-");
 
-      set_graphic_parameters(i, image->default_parameter);
+      set_graphic_parameters(i, fallback_image->default_parameter);
+      graphic_info[i].bitmap = fallback_bitmap;
     }
 
     last_frame = graphic_info[i].anim_frames - 1;
@@ -1057,9 +1071,15 @@ static void InitGraphicInfo()
            "error: last animation frame (%d) out of bounds (%d, %d)",
            last_frame, src_x, src_y);
       Error(ERR_RETURN, "custom graphic rejected for this element/action");
+
+      if (i == fallback_graphic)
+       Error(ERR_EXIT, "fatal error: no fallback graphic available");
+
+      Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic");
       Error(ERR_RETURN_LINE, "-");
 
-      set_graphic_parameters(i, image->default_parameter);
+      set_graphic_parameters(i, fallback_image->default_parameter);
+      graphic_info[i].bitmap = fallback_bitmap;
     }
 
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
@@ -1097,8 +1117,16 @@ static void InitGraphicInfo()
   clipmasks_initialized = TRUE;
 }
 
-static void set_sound_parameters(int sound, int *parameter)
+static void set_sound_parameters(int sound, char **parameter_raw)
 {
+  int parameter[NUM_SND_ARGS];
+  int i;
+
+  /* get integer values from string parameters */
+  for (i=0; i < NUM_SND_ARGS; i++)
+    parameter[i] =
+      get_parameter_value(sound_config_suffix[i].type, parameter_raw[i]);
+
   /* explicit loop mode setting in configuration overrides default value */
   if (parameter[SND_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE)
     sound_info[sound].loop = parameter[SND_ARG_MODE_LOOP];