rnd-20060828-1-src
[rocksndiamonds.git] / src / libgame / misc.c
index 1ea2a2edb823e909267815575b6eb3121ddb6dba..916ce2bdc4a3fff781f9b546f339adecf39e3443 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-* (c) 1994-2002 Artsoft Entertainment                      *
+* (c) 1994-2006 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
@@ -328,8 +328,17 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay)
 /* random generator functions                                                */
 /* ------------------------------------------------------------------------- */
 
+#if 0
+static int foo = -1;
+#endif
+
 unsigned int init_random_number(int nr, long seed)
 {
+#if 0
+  if (nr == 0)
+    foo = 0;
+#endif
+
   if (seed == NEW_RANDOMIZE)
   {
 #if defined(TARGET_SDL)
@@ -349,7 +358,26 @@ unsigned int init_random_number(int nr, long seed)
 
 unsigned int get_random_number(int nr, int max)
 {
+#if 0
+  if (max > 0)
+  {
+    long int rnd_raw = random_linux_libc(nr);
+    unsigned int rnd = rnd_raw % max;
+
+    if (nr == 0)
+    {
+      printf("::: %d: %d [%d MOD %d]\n", foo++, rnd, rnd_raw, max);
+    }
+
+    return rnd;
+  }
+  else
+  {
+    return 0;
+  }
+#else
   return (max > 0 ? random_linux_libc(nr) % max : 0);
+#endif
 }
 
 
@@ -790,8 +818,6 @@ char *GetError()
   return internal_error;
 }
 
-#if 1
-
 void Error(int mode, char *format, ...)
 {
   static boolean last_line_was_separator = FALSE;
@@ -853,87 +879,6 @@ void Error(int mode, char *format, ...)
   }
 }
 
-#else
-
-void Error(int mode, char *format, ...)
-{
-  static boolean last_line_was_separator = FALSE;
-  char *process_name = "";
-  FILE *error = stderr;
-  char *newline = "\n";
-
-  /* display warnings only when running in verbose mode */
-  if (mode & ERR_WARN && !options.verbose)
-    return;
-
-  if (mode == ERR_RETURN_LINE)
-  {
-    if (!last_line_was_separator)
-      fprintf_line(error, format, 79);
-
-    last_line_was_separator = TRUE;
-
-    return;
-  }
-
-  last_line_was_separator = FALSE;
-
-#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
-  newline = "\r\n";
-
-  if ((error = openErrorFile()) == NULL)
-  {
-    printf("Cannot write to error output file!%s", newline);
-
-    program.exit_function(1);
-  }
-#endif
-
-  if (mode & ERR_SOUND_SERVER)
-    process_name = " sound server";
-  else if (mode & ERR_NETWORK_SERVER)
-    process_name = " network server";
-  else if (mode & ERR_NETWORK_CLIENT)
-    process_name = " network client **";
-
-  if (format)
-  {
-    va_list ap;
-
-    fprintf(error, "%s%s: ", program.command_basename, process_name);
-
-    if (mode & ERR_WARN)
-      fprintf(error, "warning: ");
-
-    va_start(ap, format);
-    vfprintf(error, format, ap);
-    va_end(ap);
-  
-    fprintf(error, "%s", newline);
-  }
-  
-  if (mode & ERR_HELP)
-    fprintf(error, "%s: Try option '--help' for more information.%s",
-           program.command_basename, newline);
-
-  if (mode & ERR_EXIT)
-    fprintf(error, "%s%s: aborting%s",
-           program.command_basename, process_name, newline);
-
-  if (error != stderr)
-    fclose(error);
-
-  if (mode & ERR_EXIT)
-  {
-    if (mode & ERR_FROM_SERVER)
-      exit(1);                         /* child process: normal exit */
-    else
-      program.exit_function(1);                /* main process: clean up stuff */
-  }
-}
-
-#endif
-
 
 /* ------------------------------------------------------------------------- */
 /* checked memory allocation and freeing functions                           */
@@ -1320,13 +1265,8 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
       sprintf(name_buffer, "%c", '0' + (char)(key - KSYM_0));
     else if (key >= KSYM_KP_0 && key <= KSYM_KP_9)
       sprintf(name_buffer, "keypad %c", '0' + (char)(key - KSYM_KP_0));
-#if 1
     else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST)
       sprintf(name_buffer, "F%d", (int)(key - KSYM_FKEY_FIRST + 1));
-#else
-    else if (key >= KSYM_FKEY_FIRST && key <= KSYM_FKEY_LAST)
-      sprintf(name_buffer, "function F%d", (int)(key - KSYM_FKEY_FIRST + 1));
-#endif
     else if (key == KSYM_UNDEFINED)
       strcpy(name_buffer, "(undefined)");
     else
@@ -1632,7 +1572,7 @@ void deleteNodeFromList(ListNode **node_first, char *key,
 
   if (strEqual((*node_first)->key, key))
   {
-    free((*node_first)->key);
+    checked_free((*node_first)->key);
     if (destructor_function)
       destructor_function((*node_first)->content);
     *node_first = (*node_first)->next;
@@ -1923,6 +1863,25 @@ struct ScreenModeInfo *get_screen_mode_from_string(char *screen_mode_string)
   return &screen_mode;
 }
 
+void get_aspect_ratio_from_screen_mode(struct ScreenModeInfo *screen_mode,
+                                      int *x, int *y)
+{
+  float aspect_ratio = (float)screen_mode->width / (float)screen_mode->height;
+  float aspect_ratio_new;
+  int i = 1;
+
+  do
+  {
+    *x = i * aspect_ratio + 0.000001;
+    *y = i;
+
+    aspect_ratio_new = (float)*x / (float)*y;
+
+    i++;
+  }
+  while (aspect_ratio_new != aspect_ratio && *y < screen_mode->height);
+}
+
 static void FreeCustomArtworkList(struct ArtworkListInfo *,
                                  struct ListNodeInfo ***, int *);
 
@@ -2795,14 +2754,11 @@ char *getErrorFilename(char *basename)
 
 void openErrorFile()
 {
-  /* always start with reliable default values */
-  program.error_file = stderr;
+  InitUserDataDirectory();
 
-#if defined(PLATFORM_WIN32) || defined(PLATFORM_MSDOS)
   if ((program.error_file = fopen(program.error_filename, MODE_WRITE)) == NULL)
     fprintf_newline(stderr, "ERROR: cannot open file '%s' for writing!",
                    program.error_filename);
-#endif
 }
 
 void closeErrorFile()