rnd-20140304-1-src
[rocksndiamonds.git] / src / init.c
index a7ad871bdd019d4735d66077a01e15b24fbebabd..33bfb5ec409a4941074335f3372b23ceabae653e 100644 (file)
@@ -38,9 +38,6 @@
 #define CONFIG_TOKEN_FONT_INITIAL              "font.initial"
 #define CONFIG_TOKEN_GLOBAL_BUSY               "global.busy"
 
-#define DEBUG_PRINT_INIT_TIMESTAMPS            TRUE
-#define DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH      0
-
 
 static struct FontBitmapInfo font_initial[NUM_INITIAL_FONTS];
 static struct GraphicInfo    anim_initial;
@@ -89,72 +86,6 @@ static int copy_properties[][5] =
 };
 
 
-static void print_timestamp_ext(char *message, char *mode)
-{
-#if DEBUG
-#if DEBUG_PRINT_INIT_TIMESTAMPS
-  static char *debug_message = NULL;
-  static char *last_message = NULL;
-  static int counter_nr = 0;
-  int max_depth = DEBUG_PRINT_INIT_TIMESTAMPS_DEPTH;
-
-  checked_free(debug_message);
-  debug_message = getStringCat3(mode, " ", message);
-
-  if (strEqual(mode, "INIT"))
-  {
-    debug_print_timestamp(counter_nr, NULL);
-
-    if (counter_nr + 1 < max_depth)
-      debug_print_timestamp(counter_nr, debug_message);
-
-    counter_nr++;
-
-    debug_print_timestamp(counter_nr, NULL);
-  }
-  else if (strEqual(mode, "DONE"))
-  {
-    counter_nr--;
-
-    if (counter_nr + 1 < max_depth ||
-       (counter_nr == 0 && max_depth == 1))
-    {
-      last_message = message;
-
-      if (counter_nr == 0 && max_depth == 1)
-      {
-       checked_free(debug_message);
-       debug_message = getStringCat3("TIME", " ", message);
-      }
-
-      debug_print_timestamp(counter_nr, debug_message);
-    }
-  }
-  else if (!strEqual(mode, "TIME") ||
-          !strEqual(message, last_message))
-  {
-    if (counter_nr < max_depth)
-      debug_print_timestamp(counter_nr, debug_message);
-  }
-#endif
-#endif
-}
-
-static void print_timestamp_init(char *message)
-{
-  print_timestamp_ext(message, "INIT");
-}
-
-static void print_timestamp_time(char *message)
-{
-  print_timestamp_ext(message, "TIME");
-}
-
-static void print_timestamp_done(char *message)
-{
-  print_timestamp_ext(message, "DONE");
-}
-
 void DrawInitAnim()
 {
   struct GraphicInfo *graphic_info_last = graphic_info;
@@ -1196,7 +1127,6 @@ static int get_graphic_parameter_value(char *value_raw, char *suffix, int type)
   if (strEqual(value_raw, ARG_UNDEFINED))
     return ARG_UNDEFINED_VALUE;
 
-#if 1
   if (type == TYPE_ELEMENT)
   {
     char *value = getHashEntry(element_token_hash, value_raw);
@@ -1210,36 +1140,6 @@ static int get_graphic_parameter_value(char *value_raw, char *suffix, int type)
     return (value != NULL ? atoi(value) : IMG_UNDEFINED);
   }
 
-#else
-
-  int i;
-  int x = 0;
-
-  /* !!! THIS IS BUGGY !!! NOT SURE IF YOU GET ELEMENT ID OR GRAPHIC ID !!! */
-  /* !!! (possible reason why ".clone_from" with elements doesn't work) !!! */
-
-  /* !!! OPTIMIZE THIS BY USING HASH !!! */
-  for (i = 0; i < MAX_NUM_ELEMENTS; i++)
-    if (strEqual(element_info[i].token_name, value_raw))
-      return i;
-
-  /* !!! OPTIMIZE THIS BY USING HASH !!! */
-  for (i = 0; image_config[i].token != NULL; i++)
-  {
-    int len_config_value = strlen(image_config[i].value);
-
-    if (!strEqual(&image_config[i].value[len_config_value - 4], ".pcx") &&
-       !strEqual(&image_config[i].value[len_config_value - 4], ".wav") &&
-       !strEqual(image_config[i].value, UNDEFINED_FILENAME))
-      continue;
-
-    if (strEqual(image_config[i].token, value_raw))
-      return x;
-
-    x++;
-  }
-#endif
-
   return -1;
 }
 
@@ -2102,6 +2002,54 @@ static void InitGraphicCompatibilityInfo()
     }
   }
 
+#if 1
+  InitGraphicCompatibilityInfo_Doors();
+#endif
+
+#if 0
+  struct
+  {
+    int graphic;
+    int *width, *height;
+    boolean right_wing;
+  }
+  doors[] =
+  {
+    { IMG_DOOR_1_WING_LEFT,    &door_1.width,  &door_1.height, FALSE   },
+    { IMG_DOOR_1_WING_RIGHT,   &door_1.width,  &door_1.height, TRUE    },
+    { IMG_DOOR_2_WING_LEFT,    &door_2.width,  &door_2.height, FALSE   },
+    { IMG_DOOR_2_WING_RIGHT,   &door_2.width,  &door_2.height, TRUE    },
+
+    { 0,                       NULL,           NULL,           FALSE   }
+  };
+
+  for (i = 0; doors[i].graphic != 0; i++)
+  {
+    int graphic = doors[i].graphic;
+    int *width  = doors[i].width;
+    int *height = doors[i].height;
+    boolean right_wing = doors[i].right_wing;
+
+    struct FileInfo *fi = getImageListEntryFromImageID(graphic);
+    struct GraphicInfo *g = &graphic_info[graphic];
+
+    if (!fi->redefined)
+    {
+      if (*width != -1)
+      {
+       // correct start position for right wing of "standard" door graphic
+       if (right_wing)
+         g->src_x += g->width - *width;
+
+       g->width = *width;
+      }
+
+      if (*height != -1)
+       g->height = *height;
+    }
+  }
+#endif
+
 #if 0
   for (i = 0; i < num_images; i++)
   {
@@ -2525,6 +2473,8 @@ static void ReinitializeGraphics()
   print_timestamp_time("InitGadgets");
   InitToons();
   print_timestamp_time("InitToons");
+  InitDoors();
+  print_timestamp_time("InitDoors");
 
   print_timestamp_done("ReinitializeGraphics");
 }
@@ -5059,7 +5009,8 @@ static void InitGlobal()
   /* create hash from graphic token list */
   graphic_token_hash = newSetupFileHash();
   for (graphic = 0, i = 0; image_config[i].token != NULL; i++)
-    if (strSuffix(image_config[i].value, ".pcx") ||
+    if (strSuffix(image_config[i].value, ".png") ||
+       strSuffix(image_config[i].value, ".pcx") ||
        strSuffix(image_config[i].value, ".wav") ||
        strEqual(image_config[i].value, UNDEFINED_FILENAME))
       setHashEntry(graphic_token_hash,
@@ -5126,7 +5077,7 @@ static void InitGlobal()
   global.fading_type = TYPE_ENTER_MENU;
 #endif
 
-  global.use_envelope_request = FALSE; /* !!! MOVE TO ARTWORK CONFIG !!! */
+  global.use_envelope_request = FALSE;
 }
 
 void Execute_Command(char *command)
@@ -5312,7 +5263,56 @@ void Execute_Command(char *command)
   }
 
 #if DEBUG
-#if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+  else if (strEqual(command, "SDL_ListModes"))
+  {
+    SDL_Init(SDL_INIT_VIDEO);
+
+    int num_displays = SDL_GetNumVideoDisplays();
+
+    // check if there are any displays available
+    if (num_displays < 0)
+    {
+      printf("No displays available: %s\n", SDL_GetError());
+
+      exit(-1);
+    }
+
+    for (i = 0; i < num_displays; i++)
+    {
+      int num_modes = SDL_GetNumDisplayModes(i);
+      int j;
+
+      printf("Available display modes for display %d:\n", i);
+
+      // check if there are any display modes available for this display
+      if (num_modes < 0)
+      {
+       printf("No display modes available for display %d: %s\n",
+              i, SDL_GetError());
+
+       exit(-1);
+      }
+
+      for (j = 0; j < num_modes; j++)
+      {
+       SDL_DisplayMode mode;
+
+       if (SDL_GetDisplayMode(i, j, &mode) < 0)
+       {
+         printf("Cannot get display mode %d for display %d: %s\n",
+                j, i, SDL_GetError());
+
+         exit(-1);
+       }
+
+       printf("- %d x %d\n", mode.w, mode.h);
+      }
+    }
+
+    exit(0);
+  }
+#elif defined(TARGET_SDL)
   else if (strEqual(command, "SDL_ListModes"))
   {
     SDL_Rect **modes;
@@ -5338,10 +5338,10 @@ void Execute_Command(char *command)
     }
     else
     {
-      printf("Available Modes:\n");
+      printf("Available display modes:\n");
 
-      for(i = 0; modes[i]; i++)
-       printf("  %d x %d\n", modes[i]->w, modes[i]->h);
+      for (i = 0; modes[i]; i++)
+       printf("- %d x %d\n", modes[i]->w, modes[i]->h);
     }
 
     exit(0);
@@ -5543,6 +5543,7 @@ static void InitMixer()
 
 void InitGfxBuffers()
 {
+  /* create additional image buffers for double-buffering and cross-fading */
   ReCreateBitmap(&bitmap_db_store, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
   ReCreateBitmap(&bitmap_db_cross, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
   ReCreateBitmap(&bitmap_db_field, FXSIZE, FYSIZE, DEFAULT_DEPTH);
@@ -5556,6 +5557,7 @@ void InitGfxBuffers()
                   bitmap_db_field);
   InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE);
   InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE);
+  InitGfxDoor3Info(EX, EY, EXSIZE, EYSIZE);
   InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE);
   InitGfxScrollbufferInfo(FXSIZE, FYSIZE);
   InitGfxClipRegion(FALSE, -1, -1, -1, -1);
@@ -5610,27 +5612,7 @@ void InitGfx()
   if (filename_font_initial == NULL)   /* should not happen */
     Error(ERR_EXIT, "cannot get filename for '%s'", CONFIG_TOKEN_FONT_INITIAL);
 
-#if 1
   InitGfxBuffers();
-#else
-  /* create additional image buffers for double-buffering and cross-fading */
-  bitmap_db_store = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
-  bitmap_db_cross = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH);
-  bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH);
-  bitmap_db_panel = CreateBitmap(DXSIZE, DYSIZE, DEFAULT_DEPTH);
-  bitmap_db_door  = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH);
-  bitmap_db_toons = CreateBitmap(FULL_SXSIZE, FULL_SYSIZE, DEFAULT_DEPTH);
-
-  /* initialize screen properties */
-  InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE,
-                  REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE,
-                  bitmap_db_field);
-  InitGfxDoor1Info(DX, DY, DXSIZE, DYSIZE);
-  InitGfxDoor2Info(VX, VY, VXSIZE, VYSIZE);
-  InitGfxWindowInfo(WIN_XSIZE, WIN_YSIZE);
-  InitGfxScrollbufferInfo(FXSIZE, FYSIZE);
-#endif
-
   InitGfxCustomArtworkInfo();
 
   bitmap_font_initial = LoadCustomImage(filename_font_initial);
@@ -5643,14 +5625,15 @@ void InitGfx()
   font_height = getFontHeight(FC_RED);
 
 #if 1
-  DrawInitText(getWindowTitleString(), 20, FC_YELLOW);
+  DrawInitTextAlways(getWindowTitleString(), 20, FC_YELLOW);
 #else
-  DrawInitText(getProgramInitString(), 20, FC_YELLOW);
+  DrawInitTextAlways(getProgramInitString(), 20, FC_YELLOW);
 #endif
-  DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
-  DrawInitText(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height, FC_RED);
+  DrawInitTextAlways(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
+  DrawInitTextAlways(PROGRAM_WEBSITE_STRING, WIN_YSIZE - 20 - font_height,
+                    FC_RED);
 
-  DrawInitText("Loading graphics", 120, FC_GREEN);
+  DrawInitTextAlways("Loading graphics", 120, FC_GREEN);
 
 #if 1
 #if 1
@@ -6266,6 +6249,8 @@ void ReloadCustomArtwork(int force_reload)
 #endif
 
   print_timestamp_done("ReloadCustomArtwork");
+
+  LimitScreenUpdates(FALSE);
 }
 
 void KeyboardAutoRepeatOffUnlessAutoplay()
@@ -6276,6 +6261,10 @@ void KeyboardAutoRepeatOffUnlessAutoplay()
 
 void DisplayExitMessage(char *format, va_list ap)
 {
+  // check if draw buffer and fonts for exit message are already available
+  if (drawto == NULL || font_initial[NUM_INITIAL_FONTS - 1].bitmap == NULL)
+    return;
+
   int font_1 = FC_RED;
   int font_2 = FC_YELLOW;
   int font_3 = FC_BLUE;
@@ -6389,7 +6378,7 @@ void OpenAll()
   InitVideoDisplay();
   InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen);
 
-  InitEventFilter(FilterMouseMotionEvents);
+  InitEventFilter(FilterEvents);
 
   print_timestamp_time("[init video stuff]");
 
@@ -6465,6 +6454,24 @@ void OpenAll()
   DrawMainMenu();
 
   InitNetworkServer();
+
+#if 0
+  Error(ERR_DEBUG, "::: SDL_GetBasePath() == '%s'",
+       SDL_GetBasePath());
+  Error(ERR_DEBUG, "::: SDL_GetPrefPath() == '%s'",
+       SDL_GetPrefPath("artsoft", "rocksndiamonds"));
+#if defined(PLATFORM_ANDROID)
+  Error(ERR_DEBUG, "::: SDL_AndroidGetInternalStoragePath() == '%s'",
+       SDL_AndroidGetInternalStoragePath());
+  Error(ERR_DEBUG, "::: SDL_AndroidGetExternalStoragePath() == '%s'",
+       SDL_AndroidGetExternalStoragePath());
+  Error(ERR_DEBUG, "::: SDL_AndroidGetExternalStorageState() == '%s'",
+       (SDL_AndroidGetExternalStorageState() ==
+        SDL_ANDROID_EXTERNAL_STORAGE_READ ? "read" :
+        SDL_AndroidGetExternalStorageState() ==
+        SDL_ANDROID_EXTERNAL_STORAGE_WRITE ? "write" : "not available"));
+#endif
+#endif
 }
 
 void CloseAllAndExit(int exit_value)
@@ -6485,8 +6492,14 @@ void CloseAllAndExit(int exit_value)
   FreeAllImages();
 
 #if defined(TARGET_SDL)
+#if defined(TARGET_SDL2)
+  // !!! TODO !!!
+  // set a flag to tell the network server thread to quit and wait for it
+  // using SDL_WaitThread()
+#else
   if (network_server)  /* terminate network server */
     SDL_KillThread(server_thread);
+#endif
 #endif
 
   CloseVideoDisplay();