rnd-20001205-3-src
[rocksndiamonds.git] / src / files.c
index d04e0fb2c69cef10597e3151da3e2fe710cb8e9c..884571eb3b4915e770bd52cbba1152ec490976cd 100644 (file)
@@ -1,24 +1,24 @@
 /***********************************************************
-*  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
+* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-*  (c) 1995-98 Artsoft Entertainment                       *
-*              Holger Schemel                              *
-*              Oststrasse 11a                              *
-*              33604 Bielefeld                             *
-*              phone: ++49 +521 290471                     *
-*              email: aeglos@valinor.owl.de                *
+* (c) 1995-2000 Artsoft Entertainment                      *
+*               Holger Schemel                             *
+*               Detmolder Strasse 189                      *
+*               33604 Bielefeld                            *
+*               Germany                                    *
+*               e-mail: info@artsoft.org                   *
 *----------------------------------------------------------*
-*  files.h                                                 *
+* files.c                                                  *
 ***********************************************************/
 
 #include <ctype.h>
 #include <dirent.h>
 #include <sys/stat.h>
-#include <unistd.h>
+
+#include "libgame/libgame.h"
 
 #include "files.h"
 #include "tools.h"
-#include "misc.h"
 #include "tape.h"
 #include "joystick.h"
 
@@ -46,8 +46,7 @@
 #define TAPE_COOKIE_10         "ROCKSNDIAMONDS_LEVELREC_FILE_VERSION_1.0"
 
 /* file names and filename extensions */
-#ifndef MSDOS
-#define USERDATA_DIRECTORY     ".rocksndiamonds"
+#if !defined(PLATFORM_MSDOS)
 #define LEVELSETUP_DIRECTORY   "levelsetup"
 #define SETUP_FILENAME         "setup.conf"
 #define LEVELSETUP_FILENAME    "levelsetup.conf"
@@ -56,7 +55,6 @@
 #define TAPEFILE_EXTENSION     "tape"
 #define SCOREFILE_EXTENSION    "score"
 #else
-#define USERDATA_DIRECTORY     "userdata"
 #define LEVELSETUP_DIRECTORY   "lvlsetup"
 #define SETUP_FILENAME         "setup.cnf"
 #define LEVELSETUP_FILENAME    "lvlsetup.cnf"
 #define LEVELFILE_EXTENSION    "lvl"
 #define TAPEFILE_EXTENSION     "tap"
 #define SCOREFILE_EXTENSION    "sco"
-#define ERROR_FILENAME         "error.out"
 #endif
 
+#if defined(PLATFORM_WIN32)
+#ifndef S_IRGRP
+#define S_IRGRP S_IRUSR
+#endif
+#ifndef S_IROTH
+#define S_IROTH S_IRUSR
+#endif
+#ifndef S_IWGRP
+#define S_IWGRP S_IWUSR
+#endif
+#ifndef S_IWOTH
+#define S_IWOTH S_IWUSR
+#endif
+#ifndef S_IXGRP
+#define S_IXGRP S_IXUSR
+#endif
+#ifndef S_IXOTH
+#define S_IXOTH S_IXUSR
+#endif
+#endif /* PLATFORM_WIN32 */
+
 /* file permissions for newly written files */
 #define MODE_R_ALL             (S_IRUSR | S_IRGRP | S_IROTH)
 #define MODE_W_ALL             (S_IWUSR | S_IWGRP | S_IWOTH)
 #define MODE_X_ALL             (S_IXUSR | S_IXGRP | S_IXOTH)
-#define USERDATA_DIR_MODE      (MODE_R_ALL | MODE_X_ALL | S_IWUSR)
 #define LEVEL_PERMS            (MODE_R_ALL | MODE_W_ALL)
 #define SCORE_PERMS            LEVEL_PERMS
 #define TAPE_PERMS             LEVEL_PERMS
@@ -187,21 +204,6 @@ char *getLevelClassDescription(struct LevelDirInfo *ldi)
 static void SaveUserLevelInfo();               /* for 'InitUserLevelDir()' */
 static char *getSetupLine(char *, int);                /* for 'SaveUserLevelInfo()' */
 
-char *getUserDataDir()
-{
-  static char *userdata_dir = NULL;
-
-  if (!userdata_dir)
-  {
-    char *home_dir = getHomeDir();
-    char *data_dir = USERDATA_DIRECTORY;
-
-    userdata_dir = getPath2(home_dir, data_dir);
-  }
-
-  return userdata_dir;
-}
-
 static char *getSetupDir()
 {
   return getUserDataDir();
@@ -321,18 +323,6 @@ static char *getScoreFilename(int nr)
   return filename;
 }
 
-static void createDirectory(char *dir, char *text)
-{
-  if (access(dir, F_OK) != 0)
-    if (mkdir(dir, USERDATA_DIR_MODE) != 0)
-      Error(ERR_WARN, "cannot create %s directory '%s'", text, dir);
-}
-
-static void InitUserDataDirectory()
-{
-  createDirectory(getUserDataDir(), "user data");
-}
-
 static void InitTapeDirectory(char *level_subdir)
 {
   createDirectory(getUserDataDir(), "user data");
@@ -1051,39 +1041,40 @@ void SaveScore(int level_nr)
 #define SETUP_TOKEN_TEAM_MODE          10
 #define SETUP_TOKEN_HANDICAP           11
 #define SETUP_TOKEN_TIME_LIMIT         12
+#define SETUP_TOKEN_FULLSCREEN         13
 
 /* player setup */
-#define SETUP_TOKEN_USE_JOYSTICK       13
-#define SETUP_TOKEN_JOY_DEVICE_NAME    14
-#define SETUP_TOKEN_JOY_XLEFT          15
-#define SETUP_TOKEN_JOY_XMIDDLE                16
-#define SETUP_TOKEN_JOY_XRIGHT         17
-#define SETUP_TOKEN_JOY_YUPPER         18
-#define SETUP_TOKEN_JOY_YMIDDLE                19
-#define SETUP_TOKEN_JOY_YLOWER         20
-#define SETUP_TOKEN_JOY_SNAP           21
-#define SETUP_TOKEN_JOY_BOMB           22
-#define SETUP_TOKEN_KEY_LEFT           23
-#define SETUP_TOKEN_KEY_RIGHT          24
-#define SETUP_TOKEN_KEY_UP             25
-#define SETUP_TOKEN_KEY_DOWN           26
-#define SETUP_TOKEN_KEY_SNAP           27
-#define SETUP_TOKEN_KEY_BOMB           28
+#define SETUP_TOKEN_USE_JOYSTICK       14
+#define SETUP_TOKEN_JOY_DEVICE_NAME    15
+#define SETUP_TOKEN_JOY_XLEFT          16
+#define SETUP_TOKEN_JOY_XMIDDLE                17
+#define SETUP_TOKEN_JOY_XRIGHT         18
+#define SETUP_TOKEN_JOY_YUPPER         19
+#define SETUP_TOKEN_JOY_YMIDDLE                20
+#define SETUP_TOKEN_JOY_YLOWER         21
+#define SETUP_TOKEN_JOY_SNAP           22
+#define SETUP_TOKEN_JOY_BOMB           23
+#define SETUP_TOKEN_KEY_LEFT           24
+#define SETUP_TOKEN_KEY_RIGHT          25
+#define SETUP_TOKEN_KEY_UP             26
+#define SETUP_TOKEN_KEY_DOWN           27
+#define SETUP_TOKEN_KEY_SNAP           28
+#define SETUP_TOKEN_KEY_BOMB           29
 
 /* level directory info */
-#define LEVELINFO_TOKEN_NAME           29
-#define LEVELINFO_TOKEN_NAME_SHORT     30
-#define LEVELINFO_TOKEN_NAME_SORTING   31
-#define LEVELINFO_TOKEN_AUTHOR         32
-#define LEVELINFO_TOKEN_IMPORTED_FROM  33
-#define LEVELINFO_TOKEN_LEVELS         34
-#define LEVELINFO_TOKEN_FIRST_LEVEL    35
-#define LEVELINFO_TOKEN_SORT_PRIORITY  36
-#define LEVELINFO_TOKEN_LEVEL_GROUP    37
-#define LEVELINFO_TOKEN_READONLY       38
+#define LEVELINFO_TOKEN_NAME           30
+#define LEVELINFO_TOKEN_NAME_SHORT     31
+#define LEVELINFO_TOKEN_NAME_SORTING   32
+#define LEVELINFO_TOKEN_AUTHOR         33
+#define LEVELINFO_TOKEN_IMPORTED_FROM  34
+#define LEVELINFO_TOKEN_LEVELS         35
+#define LEVELINFO_TOKEN_FIRST_LEVEL    36
+#define LEVELINFO_TOKEN_SORT_PRIORITY  37
+#define LEVELINFO_TOKEN_LEVEL_GROUP    38
+#define LEVELINFO_TOKEN_READONLY       39
 
 #define FIRST_GLOBAL_SETUP_TOKEN       SETUP_TOKEN_PLAYER_NAME
-#define LAST_GLOBAL_SETUP_TOKEN                SETUP_TOKEN_TIME_LIMIT
+#define LAST_GLOBAL_SETUP_TOKEN                SETUP_TOKEN_FULLSCREEN
 
 #define FIRST_PLAYER_SETUP_TOKEN       SETUP_TOKEN_USE_JOYSTICK
 #define LAST_PLAYER_SETUP_TOKEN                SETUP_TOKEN_KEY_BOMB
@@ -1127,6 +1118,7 @@ static struct
   { TYPE_SWITCH,  &si.team_mode,       "team_mode"                     },
   { TYPE_SWITCH,  &si.handicap,                "handicap"                      },
   { TYPE_SWITCH,  &si.time_limit,      "time_limit"                    },
+  { TYPE_SWITCH,  &si.fullscreen,      "fullscreen"                    },
 
   /* player setup */
   { TYPE_BOOLEAN, &sii.use_joystick,   ".use_joystick"                 },
@@ -1500,6 +1492,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->team_mode = FALSE;
   si->handicap = TRUE;
   si->time_limit = TRUE;
+  si->fullscreen = FALSE;
 
   for (i=0; i<MAX_PLAYERS; i++)
   {
@@ -1513,12 +1506,12 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
     si->input[i].joy.ylower  = JOYSTICK_YLOWER;
     si->input[i].joy.snap  = (i == 0 ? JOY_BUTTON_1 : 0);
     si->input[i].joy.bomb  = (i == 0 ? JOY_BUTTON_2 : 0);
-    si->input[i].key.left  = (i == 0 ? DEFAULT_KEY_LEFT  : KEY_UNDEFINED);
-    si->input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINED);
-    si->input[i].key.up    = (i == 0 ? DEFAULT_KEY_UP    : KEY_UNDEFINED);
-    si->input[i].key.down  = (i == 0 ? DEFAULT_KEY_DOWN  : KEY_UNDEFINED);
-    si->input[i].key.snap  = (i == 0 ? DEFAULT_KEY_SNAP  : KEY_UNDEFINED);
-    si->input[i].key.bomb  = (i == 0 ? DEFAULT_KEY_BOMB  : KEY_UNDEFINED);
+    si->input[i].key.left  = (i == 0 ? DEFAULT_KEY_LEFT  : KSYM_UNDEFINED);
+    si->input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KSYM_UNDEFINED);
+    si->input[i].key.up    = (i == 0 ? DEFAULT_KEY_UP    : KSYM_UNDEFINED);
+    si->input[i].key.down  = (i == 0 ? DEFAULT_KEY_DOWN  : KSYM_UNDEFINED);
+    si->input[i].key.snap  = (i == 0 ? DEFAULT_KEY_SNAP  : KSYM_UNDEFINED);
+    si->input[i].key.bomb  = (i == 0 ? DEFAULT_KEY_BOMB  : KSYM_UNDEFINED);
   }
 }
 
@@ -2050,7 +2043,7 @@ static void checkSeriesInfo()
   level_directory = getPath2((leveldir_current->user_defined ?
                              getUserLevelDir("") :
                              options.level_directory),
-                            leveldir_current->filename);
+                            leveldir_current->fullpath);
 
   if ((dir = opendir(level_directory)) == NULL)
   {
@@ -2185,46 +2178,3 @@ void SaveLevelSetup_SeriesInfo()
 
   chmod(filename, SETUP_PERMS);
 }
-
-#ifdef MSDOS
-void initErrorFile()
-{
-  char *filename;
-
-  InitUserDataDirectory();
-
-  filename = getPath2(getUserDataDir(), ERROR_FILENAME);
-  unlink(filename);
-  free(filename);
-}
-
-FILE *openErrorFile()
-{
-  char *filename;
-  FILE *error_file;
-
-  filename = getPath2(getUserDataDir(), ERROR_FILENAME);
-  error_file = fopen(filename, "a");
-  free(filename);
-
-  return error_file;
-}
-
-void dumpErrorFile()
-{
-  char *filename;
-  FILE *error_file;
-
-  filename = getPath2(getUserDataDir(), ERROR_FILENAME);
-  error_file = fopen(filename, "r");
-  free(filename);
-
-  if (error_file != NULL)
-  {
-    while (!feof(error_file))
-      fputc(fgetc(error_file), stderr);
-
-    fclose(error_file);
-  }
-}
-#endif