rnd-20030105-1-src
[rocksndiamonds.git] / src / init.c
index 926d429e307dbfb17ba1d54f366b6aa22a7a26b7..a77779d9e8f9f99a8a98ef609bc55c9fdc16350e 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,11 @@ 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);
+
+  SetBackgroundBitmap(NULL);
+
+  InitGadgets();
+  InitToons();
 }
 
 static void InitImages()
@@ -407,11 +427,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);
@@ -468,7 +483,7 @@ void InitGfxBackground()
   fieldbuffer = bitmap_db_field;
   SetDrawtoField(DRAW_BACKBUFFER);
 
-  BlitBitmap(new_graphic_info[IMG_MENU_BACK].bitmap, backbuffer,
+  BlitBitmap(new_graphic_info[IMG_MENU_FRAME].bitmap, backbuffer,
             0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
   ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
   ClearRectangle(bitmap_db_door, 0, 0, 3 * DXSIZE, DYSIZE + VYSIZE);
@@ -573,6 +588,10 @@ void ReloadCustomArtwork()
     }
 #endif
 
+#if 0
+    SyncDisplay();
+#endif
+
     ReinitializeGraphics();
 
     FreeTileClipmasks();
@@ -638,13 +657,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 +703,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)
@@ -739,11 +774,18 @@ void InitElementInfo()
 
 static void InitGraphicInfo()
 {
+  static boolean clipmasks_initialized = FALSE;
   static int gfx_action[NUM_IMAGE_FILES];
   Bitmap *src_bitmap;
   int src_x, src_y;
   int first_frame, last_frame;
   int i;
+#if defined(TARGET_X11_NATIVE)
+  Pixmap src_pixmap;
+  XGCValues clip_gc_values;
+  unsigned long clip_gc_valuemask;
+  GC copy_clipmask_gc = None;
+#endif
 
   image_files = getCurrentImageList();
 
@@ -766,6 +808,22 @@ static void InitGraphicInfo()
     i++;
   }
 
+#if defined(TARGET_X11_NATIVE)
+  if (clipmasks_initialized)
+  {
+    for (i=0; i<NUM_IMAGE_FILES; i++)
+    {
+      if (new_graphic_info[i].clip_mask)
+       XFreePixmap(display, new_graphic_info[i].clip_mask);
+      if (new_graphic_info[i].clip_gc)
+       XFreeGC(display, new_graphic_info[i].clip_gc);
+
+      new_graphic_info[i].clip_mask = None;
+      new_graphic_info[i].clip_gc = None;
+    }
+  }
+#endif
+
   for (i=0; i<NUM_IMAGE_FILES; i++)
   {
     int *parameter = image_files[i].parameter;
@@ -838,20 +896,76 @@ static void InitGraphicInfo()
 
     /* now check if no animation frames are outside of the loaded image */
 
+    if (new_graphic_info[i].bitmap == NULL)
+      continue;                /* skip check for optional images that are undefined */
+
     first_frame = 0;
     getGraphicSource(i, first_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: 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);
+    }
+
+#if defined(TARGET_X11_NATIVE)
+    /* currently we need only a tile clip mask from the first frame */
+    getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y);
+
+    if (copy_clipmask_gc == None)
+    {
+      clip_gc_values.graphics_exposures = False;
+      clip_gc_valuemask = GCGraphicsExposures;
+      copy_clipmask_gc = XCreateGC(display, src_bitmap->clip_mask,
+                                  clip_gc_valuemask, &clip_gc_values);
+    }
+
+    new_graphic_info[i].clip_mask =
+      XCreatePixmap(display, window->drawable, TILEX, TILEY, 1);
+
+    src_pixmap = src_bitmap->clip_mask;
+    XCopyArea(display, src_pixmap, new_graphic_info[i].clip_mask,
+             copy_clipmask_gc, src_x, src_y, TILEX, TILEY, 0, 0);
+
+    clip_gc_values.graphics_exposures = False;
+    clip_gc_values.clip_mask = new_graphic_info[i].clip_mask;
+    clip_gc_valuemask = GCGraphicsExposures | GCClipMask;
+    new_graphic_info[i].clip_gc =
+      XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values);
+#endif
   }
+
+#if defined(TARGET_X11_NATIVE)
+  if (copy_clipmask_gc)
+    XFreeGC(display, copy_clipmask_gc);
+#endif
+
+  clipmasks_initialized = TRUE;
 }
 
 static void InitSoundInfo()
@@ -2078,9 +2192,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 +2210,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 +2229,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);
   }
 }