rnd-20030104-1-src
[rocksndiamonds.git] / src / init.c
index 926d429e307dbfb17ba1d54f366b6aa22a7a26b7..66083aeb87d888a3a550f65ceb875a4e6bfc760d 100644 (file)
@@ -57,6 +57,7 @@ static char *image_filename[NUM_PICTURES] =
 
 static Bitmap *bitmap_font_initial = NULL;
 
+static void InitGlobal(void);
 static void InitSetup(void);
 static void InitPlayerInfo(void);
 static void InitLevelInfo(void);
@@ -73,16 +74,14 @@ static void InitElementProperties(void);
 static void InitElementInfo(void);
 static void InitGraphicInfo(void);
 static void InitSoundInfo();
-static void Execute_Debug_Command(char *);
+static void Execute_Command(char *);
 
 void OpenAll(void)
 {
-  if (options.debug_command)
-  {
-    Execute_Debug_Command(options.debug_command);
+  InitGlobal();                /* initialize some global variables */
 
-    exit(0);
-  }
+  if (options.execute_command)
+    Execute_Command(options.execute_command);
 
   if (options.serveronly)
   {
@@ -125,16 +124,32 @@ void OpenAll(void)
 
   InitImages();                        /* needs to know current level directory */
   InitSound();                 /* needs to know current level directory */
+#if 0
   InitGadgets();               /* needs images + number of level series */
+#endif
 
   InitGfxBackground();
-  InitToons();
+
+  if (global.autoplay_leveldir)
+  {
+    AutoPlayTape();
+    return;
+  }
 
   DrawMainMenu();
 
   InitNetworkServer();
 }
 
+void InitGlobal()
+{
+  global.autoplay_leveldir = NULL;
+
+  global.frames_per_second = 0;
+  global.fps_slowdown = FALSE;
+  global.fps_slowdown_factor = 1;
+}
+
 void InitSetup()
 {
   LoadSetup();                                 /* global setup info */
@@ -204,6 +219,9 @@ static void ReinitializeGraphics()
               new_graphic_info[IMG_MENU_FONT_MEDIUM].bitmap,
               new_graphic_info[IMG_MENU_FONT_SMALL].bitmap,
               new_graphic_info[IMG_MENU_FONT_EM].bitmap);
+
+  InitGadgets();
+  InitToons();
 }
 
 static void InitImages()
@@ -407,11 +425,6 @@ void InitGfx()
   int i;
 #endif
 
-  /* initialize some global variables */
-  global.frames_per_second = 0;
-  global.fps_slowdown = FALSE;
-  global.fps_slowdown_factor = 1;
-
   /* initialize screen properties */
   InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
                   REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
@@ -573,6 +586,10 @@ void ReloadCustomArtwork()
     }
 #endif
 
+#if 0
+    SyncDisplay();
+#endif
+
     ReinitializeGraphics();
 
     FreeTileClipmasks();
@@ -638,13 +655,29 @@ void ReloadCustomArtwork()
 #endif
 }
 
+void FreeGadgets()
+{
+  FreeLevelEditorGadgets();
+  FreeGameButtons();
+  FreeTapeButtons();
+  FreeToolButtons();
+  FreeScreenGadgets();
+}
+
 void InitGadgets()
 {
+  static boolean gadgets_initialized = FALSE;
+
+  if (gadgets_initialized)
+    FreeGadgets();
+
   CreateLevelEditorGadgets();
   CreateGameButtons();
   CreateTapeButtons();
   CreateToolButtons();
   CreateScreenGadgets();
+
+  gadgets_initialized = TRUE;
 }
 
 void InitElementInfo()
@@ -668,9 +701,9 @@ void InitElementInfo()
     element_info[i].graphic[GFX_ACTION_DEFAULT] =
       IMG_CHAR_START + (i - EL_CHAR_START);
 
-  for (i=EL_GENERIC_START; i<=EL_GENERIC_END; i++)
+  for (i=EL_CUSTOM_START; i<=EL_CUSTOM_END; i++)
     element_info[i].graphic[GFX_ACTION_DEFAULT] =
-      IMG_GENERIC_START + (i - EL_GENERIC_START);
+      IMG_CUSTOM_START + (i - EL_CUSTOM_START);
 
   i = 0;
   while (element_to_graphic[i].element > -1)
@@ -843,14 +876,34 @@ static void InitGraphicInfo()
     if (src_x < 0 || src_y < 0 ||
        src_x + TILEX > src_bitmap->width ||
        src_y + TILEY > src_bitmap->height)
-      Error(ERR_EXIT, "InitGraphicInfo: first frame of graphic animation object %d outside of image bitmap file '%s'", i, src_bitmap->source_filename);
+    {
+      Error(ERR_RETURN, "custom artwork configuration error:");
+      Error(ERR_RETURN, "- config file: '%s'",
+           getImageConfigFilename());
+      Error(ERR_RETURN, "- config token: '%s'",
+           getTokenFromImageID(i));
+      Error(ERR_RETURN, "- image file: '%s'",
+           src_bitmap->source_filename);
+      Error(ERR_EXIT, "error: first animation frame out of bounds (%d,%d)",
+           src_x, src_y);
+    }
 
     last_frame = new_graphic_info[i].anim_frames - 1;
     getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y);
     if (src_x < 0 || src_y < 0 ||
        src_x + TILEX > src_bitmap->width ||
        src_y + TILEY > src_bitmap->height)
-      Error(ERR_EXIT, "InitGraphicInfo: last frame of graphic animation object %d outside of image bitmap file '%s'", i, src_bitmap->source_filename);
+    {
+      Error(ERR_RETURN, "custom artwork configuration error:");
+      Error(ERR_RETURN, "- config file: '%s'",
+           getImageConfigFilename());
+      Error(ERR_RETURN, "- config token: '%s'",
+           getTokenFromImageID(i));
+      Error(ERR_RETURN, "- image file: '%s'",
+           src_bitmap->source_filename);
+      Error(ERR_EXIT, "error: last animation frame out of bounds (%d,%d)",
+           src_x, src_y);
+    }
   }
 }
 
@@ -2078,9 +2131,9 @@ void InitElementProperties()
     Elementeigenschaften1[i] |= (EP_BIT_CHAR | EP_BIT_INACTIVE);
 }
 
-void Execute_Debug_Command(char *command)
+void Execute_Command(char *command)
 {
-  if (strcmp(command, "create graphicsinfo.conf") == 0)
+  if (strcmp(command, "print graphicsinfo.conf") == 0)
   {
     int i;
 
@@ -2096,8 +2149,10 @@ void Execute_Debug_Command(char *command)
       printf("# %s\n",
             getFormattedSetupEntry(image_config[i].token,
                                    image_config[i].value));
+
+    exit(0);
   }
-  else if (strcmp(command, "create soundsinfo.conf") == 0)
+  else if (strcmp(command, "print soundsinfo.conf") == 0)
   {
     int i;
 
@@ -2113,21 +2168,48 @@ void Execute_Debug_Command(char *command)
       printf("# %s\n",
             getFormattedSetupEntry(sound_config[i].token,
                                    sound_config[i].value));
+
+    exit(0);
   }
-  else if (strcmp(command, "create musicinfo.conf") == 0)
+  else if (strcmp(command, "print musicinfo.conf") == 0)
   {
     printf("# (Currently only \"name\" and \"sort_priority\" recognized.)\n");
     printf("\n");
     printf("%s\n", getFormattedSetupEntry("name", "Classic Music"));
     printf("\n");
     printf("%s\n", getFormattedSetupEntry("sort_priority", "100"));
+
+    exit(0);
+  }
+  else if (strncmp(command, "dump tape ", 10) == 0)
+  {
+    char *filename = &command[10];
+
+    if (access(filename, F_OK) != 0)
+      Error(ERR_EXIT, "cannot open file '%s'", filename);
+
+    LoadTapeFromFilename(filename);
+    DumpTape(&tape);
+
+    exit(0);
+  }
+  else if (strncmp(command, "autoplay ", 9) == 0)
+  {
+    char *str_copy = getStringCopy(&command[9]);
+    char *str_ptr = strchr(str_copy, ' ');
+
+    global.autoplay_leveldir = str_copy;
+    global.autoplay_level_nr = -1;
+
+    if (str_ptr != NULL)
+    {
+      *str_ptr++ = '\0';                       /* terminate leveldir string */
+      global.autoplay_level_nr = atoi(str_ptr);        /* get level_nr value */
+    }
   }
-  else if (strcmp(command, "help") == 0)
+  else
   {
-    printf("The following commands are recognized:\n");
-    printf("   \"create graphicsinfo.conf\"\n");
-    printf("   \"create soundsinfo.conf\"\n");
-    printf("   \"create musicinfo.conf\"\n");
+    Error(ERR_EXIT_HELP, "unrecognized command '%s'", command);
   }
 }