rnd-20020908-3-src
[rocksndiamonds.git] / src / init.c
index a06bd295bd99e5e53e82f37004be90b32498624e..2f19f9495b280a3d0f111e8e0caae5ea5563d070 100644 (file)
@@ -29,6 +29,7 @@
 static char *image_filename[NUM_PICTURES] =
 {
   "RocksScreen.pcx",
+  "RocksElements.pcx",
   "RocksDoor.pcx",
   "RocksHeroes.pcx",
   "RocksToons.pcx",
@@ -46,13 +47,16 @@ static void InitLevelInfo(void);
 static void InitArtworkInfo(void);
 static void InitLevelArtworkInfo(void);
 static void InitNetworkServer(void);
+static void InitImages(void);
 static void InitMixer(void);
 static void InitSound(void);
 static void InitGfx(void);
 static void InitGfxBackground(void);
 static void InitGadgets(void);
-static void InitElementInfo(void);
 static void InitElementProperties(void);
+static void InitElementInfo(void);
+static void InitGraphicInfo(void);
+static void InitSoundInfo();
 static void Execute_Debug_Command(char *);
 
 void OpenAll(void)
@@ -96,12 +100,13 @@ void OpenAll(void)
   InitEventFilter(FilterMouseMotionEvents);
 
   InitGfx();
-  InitElementInfo();
   InitElementProperties();     /* initializes IS_CHAR() for el2gfx() */
+  InitElementInfo();
 
   InitLevelInfo();
   InitLevelArtworkInfo();
   InitGadgets();               /* needs to know number of level series */
+  InitImages();                        /* needs to know current level directory */
   InitSound();                 /* needs to know current level directory */
 
   InitGfxBackground();
@@ -170,10 +175,21 @@ void InitNetworkServer()
 #endif
 }
 
+static void InitImages()
+{
+  InitImageList(image_config, image_config_suffix, NUM_IMAGE_FILES);
+
+  /* load custom images */
+  ReloadCustomImages();
+
+  InitGraphicInfo();
+}
+
 static void InitMixer()
 {
   OpenAudio();
-  InitSoundList(sound_effects, NUM_SOUND_EFFECTS);
+
+  InitSoundList(sound_config, sound_config_suffix, NUM_SOUND_FILES);
 
   StartMixer();
 }
@@ -184,8 +200,7 @@ static void InitSound()
   InitReloadSounds(artwork.snd_current->identifier);
   InitReloadMusic(artwork.mus_current->identifier);
 
-  /* initialize sound effect lookup table for element actions */
-  InitGameSound();
+  InitSoundInfo();
 }
 
 static void InitTileClipmasks()
@@ -265,8 +280,8 @@ static void InitTileClipmasks()
 
   clip_gc_values.graphics_exposures = False;
   clip_gc_valuemask = GCGraphicsExposures;
-  tile_clip_gc =
-    XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values);
+  tile_clip_gc = XCreateGC(display, window->drawable,
+                          clip_gc_valuemask, &clip_gc_values);
 
   for(i=0; i<NUM_BITMAPS; i++)
   {
@@ -285,9 +300,8 @@ static void InitTileClipmasks()
   /* create graphic context structures needed for clipping */
   clip_gc_values.graphics_exposures = False;
   clip_gc_valuemask = GCGraphicsExposures;
-  copy_clipmask_gc =
-    XCreateGC(display, pix[PIX_BACK]->clip_mask,
-             clip_gc_valuemask, &clip_gc_values);
+  copy_clipmask_gc = XCreateGC(display, pix[PIX_BACK]->clip_mask,
+                              clip_gc_valuemask, &clip_gc_values);
 
   /* create only those clipping Pixmaps we really need */
   for(i=0; tile_needs_clipping[i].start>=0; i++)
@@ -299,11 +313,11 @@ static void InitTileClipmasks()
       int tile = tile_needs_clipping[i].start + j;
       int graphic = tile;
       int src_x, src_y;
-      int pixmap_nr;
+      Bitmap *src_bitmap;
       Pixmap src_pixmap;
 
-      getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y);
-      src_pixmap = pix[pixmap_nr]->clip_mask;
+      getGraphicSource(graphic, &src_bitmap, &src_x, &src_y);
+      src_pixmap = src_bitmap->clip_mask;
 
       tile_clipmask[tile] = XCreatePixmap(display, window->drawable,
                                          TILEX, TILEY, 1);
@@ -485,6 +499,9 @@ void ReloadCustomArtwork()
       ReloadCustomImage(pix[i], image_filename[i]);
     }
 
+    ReloadCustomImages();
+    InitGraphicInfo();
+
     FreeTileClipmasks();
     InitTileClipmasks();
     InitGfxBackground();
@@ -835,30 +852,52 @@ void InitElementInfo()
   }
 }
 
-void InitGraphicInfo()
+static void InitGraphicInfo()
 {
   int i;
 
-  /* always start with reliable default values */
+  image_files = getCurrentImageList();
+
+  printf("D> %d\n", image_files[GFX_BD_DIAMOND].parameter[GFXARG_NUM_FRAMES]);
+  printf("W> %d\n", image_files[GFX_ROBOT_WHEEL].parameter[GFXARG_NUM_FRAMES]);
+
   for(i=0; i<MAX_GRAPHICS; i++)
   {
-    graphic_info[i].bitmap = pix[PIX_SP];      /* graphic that ... */
-    graphic_info[i].src_x = 0;                 /* ... contains ... */
-    graphic_info[i].src_y = 0;                 /* ... empty space. */
+    /* always start with reliable default values */
+    graphic_info[i].bitmap = NULL;
+    graphic_info[i].src_x = 0;
+    graphic_info[i].src_y = 0;
     graphic_info[i].anim_frames = 1;
     graphic_info[i].anim_delay = 0;
     graphic_info[i].anim_mode = ANIM_NORMAL;
+
+    getGraphicSource(i, &graphic_info[i].bitmap,
+                    &graphic_info[i].src_x, &graphic_info[i].src_y);
   }
 
-  for(i=0; i<MAX_GRAPHICS; i++)
-  {
-    int bitmap_nr;
+#if 1
+  graphic_info[GFX_ABLENK].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+  graphic_info[GFX_ABLENK].src_x = 0;
+  graphic_info[GFX_ABLENK].src_y = 0;
+
+  graphic_info[GFX_ABLENK + 1].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+  graphic_info[GFX_ABLENK + 2].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+  graphic_info[GFX_ABLENK + 3].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL);
+  graphic_info[GFX_ABLENK + 1].src_x = 1 * TILEX;
+  graphic_info[GFX_ABLENK + 2].src_x = 2 * TILEX;
+  graphic_info[GFX_ABLENK + 3].src_x = 3 * TILEX;
+  graphic_info[GFX_ABLENK + 1].src_y = 0;
+  graphic_info[GFX_ABLENK + 2].src_y = 0;
+  graphic_info[GFX_ABLENK + 3].src_y = 0;
+#endif
+}
 
-    getGraphicSource(i, &bitmap_nr,
-                    &graphic_info[i].src_x, &graphic_info[i].src_y);
+static void InitSoundInfo()
+{
+  sound_files = getCurrentSoundList();
 
-    graphic_info[i].bitmap = pix[bitmap_nr];
-  }
+  /* initialize sound effect lookup table for element actions */
+  InitGameSound();
 }
 
 void InitElementProperties()
@@ -2052,17 +2091,26 @@ void Execute_Debug_Command(char *command)
 {
   if (strcmp(command, "create graphicsinfo.conf") == 0)
   {
-    printf("# (Currently only \"name\" and \"sort_priority\" recognized.)\n");
+    int i;
+
+    printf("# You can configure additional/alternative image files here.\n");
+    printf("# (The images below are default and therefore commented out.)\n");
     printf("\n");
     printf("%s\n", getFormattedSetupEntry("name", "Classic Graphics"));
     printf("\n");
     printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
+    printf("\n");
+
+    for (i=0; image_config[i].token != NULL; i++)
+      printf("# %s\n",
+            getFormattedSetupEntry(image_config[i].token,
+                                   image_config[i].value));
   }
   else if (strcmp(command, "create soundsinfo.conf") == 0)
   {
     int i;
 
-    printf("# You can configure additional/alternative sound effects here\n");
+    printf("# You can configure additional/alternative sound files here.\n");
     printf("# (The sounds below are default and therefore commented out.)\n");
     printf("\n");
     printf("%s\n", getFormattedSetupEntry("name", "Classic Sounds"));
@@ -2070,10 +2118,10 @@ void Execute_Debug_Command(char *command)
     printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
     printf("\n");
 
-    for (i=0; i<NUM_SOUND_EFFECTS; i++)
+    for (i=0; sound_config[i].token != NULL; i++)
       printf("# %s\n",
-            getFormattedSetupEntry(sound_effects[i].text,
-                                   sound_effects[i].default_filename));
+            getFormattedSetupEntry(sound_config[i].token,
+                                   sound_config[i].value));
   }
   else if (strcmp(command, "create musicinfo.conf") == 0)
   {
@@ -2083,6 +2131,13 @@ void Execute_Debug_Command(char *command)
     printf("\n");
     printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
   }
+  else if (strcmp(command, "help") == 0)
+  {
+    printf("The following commands are recognized:\n");
+    printf("   \"create graphicsinfo.conf\"\n");
+    printf("   \"create soundsinfo.conf\"\n");
+    printf("   \"create musicinfo.conf\"\n");
+  }
 }
 
 void CloseAllAndExit(int exit_value)
@@ -2094,6 +2149,8 @@ void CloseAllAndExit(int exit_value)
   FreeAllMusic();
   CloseAudio();                /* called after freeing sounds (needed for SDL) */
 
+  FreeAllImages();
+
   FreeTileClipmasks();
   for(i=0; i<NUM_BITMAPS; i++)
     FreeBitmap(pix[i]);