rnd-19981026-2
[rocksndiamonds.git] / src / files.c
index 17bc45e5986691d8b773e6ad12dad24c7a29df79..c3cb4b8ddaf769b0566f1f8a38da72a6aa7b7cea 100644 (file)
 #include "tape.h"
 #include "joystick.h"
 
-boolean CreateNewScoreFile()
-{
-  int i,j,k;
-  char filename[MAX_FILENAME_LEN];
-  char empty_alias[MAX_NAMELEN];
-  FILE *file;
-
-  sprintf(filename,"%s/%s/%s",
-         level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
-
-  if (!(file=fopen(filename,"w")))
-    return(FALSE);
-
-  for(i=0;i<MAX_NAMELEN;i++)
-    empty_alias[i] = 0;
-  strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
-
-  fputs(SCORE_COOKIE,file);            /* Formatkennung */
-  for(i=0;i<leveldir[leveldir_nr].levels;i++)
-  {
-    for(j=0;j<MAX_SCORE_ENTRIES;j++)
-    {
-      for(k=0;k<MAX_NAMELEN;k++)
-       fputc(empty_alias[k],file);
-      fputc(0,file);
-      fputc(0,file);
-    }
-  }
-  fclose(file);
-
-  chmod(filename, SCORE_PERMS);
-  return(TRUE);
-}
-
-
-
-#if 0
-
-boolean CreateNewNamesFile(int mode)
-{
-  char filename[MAX_FILENAME_LEN];
-  FILE *file;
-
-  if (mode==PLAYER_LEVEL)
-    sprintf(filename,"%s/%s/%s",
-           level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
-  else
-    sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
-
-  if (!(file=fopen(filename,"w")))
-    return(FALSE);
-
-  fputs(NAMES_COOKIE,file);            /* Formatkennung */
-  fclose(file);
-
-  chmod(filename, NAMES_PERMS);
-  return(TRUE);
-}
-
-#endif
-
-
 boolean LoadLevelInfo()
 {
   int i;
@@ -217,6 +155,56 @@ void LoadLevel(int level_nr)
   }
 }
 
+void SaveLevel(int level_nr)
+{
+  int i,x,y;
+  char filename[MAX_FILENAME_LEN];
+  FILE *file;
+
+  sprintf(filename,"%s/%s/%d",
+         level_directory,leveldir[leveldir_nr].filename,level_nr);
+
+  if (!(file=fopen(filename,"w")))
+  {
+    Error(ERR_WARN, "cannot save level file '%s'", filename);
+    return;
+  }
+
+  fputs(LEVEL_COOKIE,file);            /* Formatkennung */
+  fputc(0x0a,file);
+
+  fputc(level.fieldx,file);
+  fputc(level.fieldy,file);
+  fputc(level.time / 256,file);
+  fputc(level.time % 256,file);
+  fputc(level.edelsteine / 256,file);
+  fputc(level.edelsteine % 256,file);
+
+  for(i=0;i<MAX_LEVNAMLEN;i++)
+    fputc(level.name[i],file);
+  for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
+    fputc(level.score[i],file);
+  for(i=0;i<4;i++)
+    for(y=0;y<3;y++)
+      for(x=0;x<3;x++)
+       fputc(level.mampfer_inhalt[i][x][y],file);
+  fputc(level.tempo_amoebe,file);
+  fputc(level.dauer_sieb,file);
+  fputc(level.dauer_ablenk,file);
+  fputc(level.amoebe_inhalt,file);
+
+  for(i=0;i<NUM_FREE_LVHD_BYTES;i++)   /* Rest frei / Headergröße 80 Bytes */
+    fputc(0,file);
+
+  for(y=0;y<lev_fieldy;y++) 
+    for(x=0;x<lev_fieldx;x++) 
+      fputc(Ur[x][y],file);
+
+  fclose(file);
+
+  chmod(filename, LEVEL_PERMS);
+}
+
 void LoadLevelTape(int level_nr)
 {
   int i;
@@ -296,250 +284,6 @@ void LoadLevelTape(int level_nr)
   tape.length_seconds = GetTapeLength();
 }
 
-void LoadScore(int level_nr)
-{
-  int i,j;
-  char filename[MAX_FILENAME_LEN];
-  char cookie[MAX_FILENAME_LEN];
-  FILE *file;
-
-  sprintf(filename,"%s/%s/%s",
-         level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
-
-  if (!(file = fopen(filename,"r")))
-  {
-    if (!CreateNewScoreFile())
-      Error(ERR_WARN, "cannot create score file '%s'", filename);
-    else if (!(file = fopen(filename,"r"))) 
-      Error(ERR_WARN, "cannot read score for level %d", level_nr);
-  }
-
-  if (file)
-  {
-    fgets(cookie,SCORE_COOKIE_LEN,file);
-    if (strcmp(cookie,SCORE_COOKIE))   /* ungültiges Format? */
-    {
-      Error(ERR_WARN, "wrong format of score file '%s'", filename);
-      fclose(file);
-      file = NULL;
-    }
-  }
-
-  if (file)
-  {
-    fseek(file,
-         SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
-         SEEK_SET);
-    for(i=0;i<MAX_SCORE_ENTRIES;i++)
-    {
-      for(j=0;j<MAX_NAMELEN;j++)
-       highscore[i].Name[j] = fgetc(file);
-      highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
-    }
-    fclose(file);
-  }
-  else
-  {
-    for(i=0;i<MAX_SCORE_ENTRIES;i++)
-    {
-      strcpy(highscore[i].Name,EMPTY_ALIAS);
-      highscore[i].Score = 0;
-    }
-  }
-}
-
-
-
-#if 0
-
-void LoadPlayerInfo(int mode)
-{
-  int i;
-  char filename[MAX_FILENAME_LEN];
-  char cookie[MAX_FILENAME_LEN];
-  FILE *file;
-  char *login_name = GetLoginName();
-  struct PlayerInfo default_player, new_player;
-  int version_10_file = FALSE;
-
-
-
-  if (mode == PLAYER_SETUP)
-    LoadSetup();
-  else if (mode == PLAYER_LEVEL)
-    LoadLevelSetup();
-
-
-
-  if (mode==PLAYER_LEVEL)
-    sprintf(filename,"%s/%s/%s",
-           level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
-  else
-    sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
-
-  for(i=0;i<MAX_NAMELEN;i++)
-    default_player.login_name[i] = default_player.alias_name[i] = 0;
-  strncpy(default_player.login_name,login_name,MAX_NAMELEN-1);
-  strncpy(default_player.alias_name,login_name,MAX_NAMELEN-1);
-  default_player.handicap = 0;
-  default_player.setup = DEFAULT_SETUP;
-  default_player.leveldir_nr = 0;
-  default_player.level_nr = 0;
-
-  new_player = default_player;
-
-  if (!(file = fopen(filename,"r")))
-  {
-    if (!CreateNewNamesFile(mode))
-      Error(ERR_WARN, "cannot create names file '%s'", filename);
-    else if (!(file = fopen(filename,"r"))) 
-      Error(ERR_WARN, "cannot read player information file '%s'", filename);
-  }
-
-  if (file)
-  {
-    fgets(cookie,NAMES_COOKIE_LEN,file);
-    if (!strcmp(cookie,NAMES_COOKIE_10))       /* altes Format? */
-      version_10_file = TRUE;
-    else if (strcmp(cookie,NAMES_COOKIE))      /* ungültiges Format? */
-    {
-      Error(ERR_WARN, "wrong format of names file '%s'", filename);
-      fclose(file);
-      file = NULL;
-    }
-  }
-
-  if (!file)
-  {
-    *local_player = default_player;
-    level_nr = default_player.level_nr;
-    return;
-  }
-
-  while(1)
-  {
-    for(i=0;i<MAX_NAMELEN;i++)
-      new_player.login_name[i] = fgetc(file);
-    for(i=0;i<MAX_NAMELEN;i++)
-      new_player.alias_name[i] = fgetc(file);
-    new_player.handicap = fgetc(file);
-    new_player.setup = (fgetc(file)<<8) | fgetc(file);
-    new_player.leveldir_nr = fgetc(file);
-    if (!version_10_file)
-    {
-      new_player.level_nr = fgetc(file);
-      for(i=0;i<10;i++)                /* currently unused bytes */
-       fgetc(file);
-    }
-    else
-      new_player.level_nr = new_player.handicap;
-
-    if (feof(file))            /* Spieler noch nicht in Liste enthalten */
-    {
-      new_player = default_player;
-
-      fclose(file);
-      if (!(file = fopen(filename,"a")))
-       Error(ERR_WARN, "cannot append new player to names file '%s'",
-             filename);
-      else
-      {
-       for(i=0;i<MAX_NAMELEN;i++)
-         fputc(new_player.login_name[i],file);
-       for(i=0;i<MAX_NAMELEN;i++)
-         fputc(new_player.alias_name[i],file);
-       fputc(new_player.handicap,file);
-       fputc(new_player.setup / 256,file);
-       fputc(new_player.setup % 256,file);
-       fputc(new_player.leveldir_nr,file);
-       if (!version_10_file)
-       {
-         fputc(new_player.level_nr,file);
-         for(i=0;i<10;i++)     /* currently unused bytes */
-           fputc(0,file);
-       }
-      }
-      break;
-    }
-    else                       /* prüfen, ob Spieler in Liste enthalten */
-      if (!strncmp(new_player.login_name,login_name,MAX_NAMELEN-1))
-       break;
-  }
-
-  if (mode==PLAYER_SETUP)
-  {
-    *local_player = new_player;
-    if (local_player->leveldir_nr < num_leveldirs)
-      leveldir_nr = local_player->leveldir_nr;
-    else
-      leveldir_nr = 0;
-  }
-  else
-  {
-    local_player->handicap = new_player.handicap;
-    local_player->level_nr = new_player.level_nr;
-  }
-
-  level_nr = local_player->level_nr;
-
-  if (file)
-    fclose(file);
-}
-
-#endif
-
-
-
-void SaveLevel(int level_nr)
-{
-  int i,x,y;
-  char filename[MAX_FILENAME_LEN];
-  FILE *file;
-
-  sprintf(filename,"%s/%s/%d",
-         level_directory,leveldir[leveldir_nr].filename,level_nr);
-
-  if (!(file=fopen(filename,"w")))
-  {
-    Error(ERR_WARN, "cannot save level file '%s'", filename);
-    return;
-  }
-
-  fputs(LEVEL_COOKIE,file);            /* Formatkennung */
-  fputc(0x0a,file);
-
-  fputc(level.fieldx,file);
-  fputc(level.fieldy,file);
-  fputc(level.time / 256,file);
-  fputc(level.time % 256,file);
-  fputc(level.edelsteine / 256,file);
-  fputc(level.edelsteine % 256,file);
-
-  for(i=0;i<MAX_LEVNAMLEN;i++)
-    fputc(level.name[i],file);
-  for(i=0;i<MAX_LEVSCORE_ENTRIES;i++)
-    fputc(level.score[i],file);
-  for(i=0;i<4;i++)
-    for(y=0;y<3;y++)
-      for(x=0;x<3;x++)
-       fputc(level.mampfer_inhalt[i][x][y],file);
-  fputc(level.tempo_amoebe,file);
-  fputc(level.dauer_sieb,file);
-  fputc(level.dauer_ablenk,file);
-  fputc(level.amoebe_inhalt,file);
-
-  for(i=0;i<NUM_FREE_LVHD_BYTES;i++)   /* Rest frei / Headergröße 80 Bytes */
-    fputc(0,file);
-
-  for(y=0;y<lev_fieldy;y++) 
-    for(x=0;x<lev_fieldx;x++) 
-      fputc(Ur[x][y],file);
-
-  fclose(file);
-
-  chmod(filename, LEVEL_PERMS);
-}
-
 void SaveLevelTape(int level_nr)
 {
   int i;
@@ -609,131 +353,120 @@ void SaveLevelTape(int level_nr)
     Request("tape saved !",REQ_CONFIRM);
 }
 
-void SaveScore(int level_nr)
+boolean CreateNewScoreFile()
 {
-  int i,j;
+  int i,j,k;
   char filename[MAX_FILENAME_LEN];
+  char empty_alias[MAX_NAMELEN];
   FILE *file;
 
   sprintf(filename,"%s/%s/%s",
          level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
 
-  if (!(file=fopen(filename,"r+")))
-  {
-    Error(ERR_WARN, "cannot save score for level %d", level_nr);
-    return;
-  }
+  if (!(file=fopen(filename,"w")))
+    return(FALSE);
 
-  fseek(file,
-       SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
-       SEEK_SET);
-  for(i=0;i<MAX_SCORE_ENTRIES;i++)
+  for(i=0;i<MAX_NAMELEN;i++)
+    empty_alias[i] = 0;
+  strncpy(empty_alias,EMPTY_ALIAS,MAX_NAMELEN-1);
+
+  fputs(SCORE_COOKIE,file);            /* Formatkennung */
+  for(i=0;i<leveldir[leveldir_nr].levels;i++)
   {
-    for(j=0;j<MAX_NAMELEN;j++)
-      fputc(highscore[i].Name[j],file);
-    fputc(highscore[i].Score / 256,file);
-    fputc(highscore[i].Score % 256,file);
+    for(j=0;j<MAX_SCORE_ENTRIES;j++)
+    {
+      for(k=0;k<MAX_NAMELEN;k++)
+       fputc(empty_alias[k],file);
+      fputc(0,file);
+      fputc(0,file);
+    }
   }
   fclose(file);
-}
-
 
+  chmod(filename, SCORE_PERMS);
+  return(TRUE);
+}
 
-#if 0
-
-void SavePlayerInfo(int mode)
+void LoadScore(int level_nr)
 {
-  int i;
+  int i,j;
   char filename[MAX_FILENAME_LEN];
   char cookie[MAX_FILENAME_LEN];
   FILE *file;
-  struct PlayerInfo default_player;
-  int version_10_file = FALSE;
-
-
-
-  if (mode == PLAYER_SETUP)
-    SaveSetup();
-  else if (mode == PLAYER_LEVEL)
-    SaveLevelSetup();
-
 
+  sprintf(filename,"%s/%s/%s",
+         level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
 
-  if (mode == PLAYER_LEVEL)
-    sprintf(filename,"%s/%s/%s",
-           level_directory,leveldir[leveldir_nr].filename,NAMES_FILENAME);
-  else
-    sprintf(filename,"%s/%s",CONFIG_PATH,NAMES_FILENAME);
+  if (!(file = fopen(filename,"r")))
+  {
+    if (!CreateNewScoreFile())
+      Error(ERR_WARN, "cannot create score file '%s'", filename);
+    else if (!(file = fopen(filename,"r"))) 
+      Error(ERR_WARN, "cannot read score for level %d", level_nr);
+  }
 
-  if (!(file = fopen(filename,"r+")))
+  if (file)
   {
-    Error(ERR_WARN, "cannot save player information to file '%s'", filename);
-    return;
+    fgets(cookie,SCORE_COOKIE_LEN,file);
+    if (strcmp(cookie,SCORE_COOKIE))   /* ungültiges Format? */
+    {
+      Error(ERR_WARN, "wrong format of score file '%s'", filename);
+      fclose(file);
+      file = NULL;
+    }
   }
 
-  fgets(cookie,NAMES_COOKIE_LEN,file);
-  if (!strcmp(cookie,NAMES_COOKIE_10)) /* altes Format? */
-    version_10_file = TRUE;
-  else if (strcmp(cookie,NAMES_COOKIE))        /* ungültiges Format? */
+  if (file)
   {
-    Error(ERR_WARN, "wrong format of names file '%s'", filename);
+    fseek(file,
+         SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
+         SEEK_SET);
+    for(i=0;i<MAX_SCORE_ENTRIES;i++)
+    {
+      for(j=0;j<MAX_NAMELEN;j++)
+       highscore[i].Name[j] = fgetc(file);
+      highscore[i].Score = (fgetc(file)<<8) | fgetc(file);
+    }
     fclose(file);
-    return;
   }
-
-  while(1)
+  else
   {
-    for(i=0;i<MAX_NAMELEN;i++)
-      default_player.login_name[i] = fgetc(file);
-    for(i=0;i<MAX_NAMELEN;i++)
-      default_player.alias_name[i] = fgetc(file);
-    default_player.handicap = fgetc(file);
-    default_player.setup = (fgetc(file)<<8) | fgetc(file);
-    default_player.leveldir_nr = fgetc(file);
-    if (!version_10_file)
+    for(i=0;i<MAX_SCORE_ENTRIES;i++)
     {
-      default_player.level_nr = fgetc(file);
-      for(i=0;i<10;i++)                /* currently unused bytes */
-       fgetc(file);
+      strcpy(highscore[i].Name,EMPTY_ALIAS);
+      highscore[i].Score = 0;
     }
-    else
-      default_player.level_nr = default_player.handicap;
-
-    if (feof(file))            /* Spieler noch nicht in Liste enthalten */
-      break;
-    else                       /* prüfen, ob Spieler in Liste enthalten */
-      if (!strncmp(default_player.login_name,
-                  local_player->login_name, MAX_NAMELEN-1))
-      {
-       fseek(file,-(2*MAX_NAMELEN+1+2+1+(version_10_file ? 0 : 11)),SEEK_CUR);
-       break;
-      }
   }
+}
 
-  local_player->level_nr = level_nr;
+void SaveScore(int level_nr)
+{
+  int i,j;
+  char filename[MAX_FILENAME_LEN];
+  FILE *file;
 
-  for(i=0;i<MAX_NAMELEN;i++)
-    fputc(local_player->login_name[i],file);
-  for(i=0;i<MAX_NAMELEN;i++)
-    fputc(local_player->alias_name[i],file);
-  fputc(local_player->handicap,file);
-  fputc(local_player->setup / 256,file);
-  fputc(local_player->setup % 256,file);
-  fputc(local_player->leveldir_nr,file);
-  if (!version_10_file)
+  sprintf(filename,"%s/%s/%s",
+         level_directory,leveldir[leveldir_nr].filename,SCORE_FILENAME);
+
+  if (!(file=fopen(filename,"r+")))
   {
-    fputc(local_player->level_nr,file);
-    for(i=0;i<10;i++)          /* currently unused bytes */
-      fputc(0,file);
+    Error(ERR_WARN, "cannot save score for level %d", level_nr);
+    return;
   }
 
+  fseek(file,
+       SCORE_COOKIE_LEN-1+level_nr*(MAX_SCORE_ENTRIES*(MAX_NAMELEN+2)),
+       SEEK_SET);
+  for(i=0;i<MAX_SCORE_ENTRIES;i++)
+  {
+    for(j=0;j<MAX_NAMELEN;j++)
+      fputc(highscore[i].Name[j],file);
+    fputc(highscore[i].Score / 256,file);
+    fputc(highscore[i].Score % 256,file);
+  }
   fclose(file);
 }
 
-#endif
-
-
-
 void LoadJoystickData()
 {
   int i;
@@ -811,6 +544,10 @@ void SaveJoystickData()
 /* new setup functions                                                       */
 /* ------------------------------------------------------------------------- */
 
+#define MAX_LINE_LEN                   1000
+#define MAX_SETUP_TOKEN_LEN            100
+#define MAX_SETUP_VALUE_LEN            100
+
 #define TOKEN_STR_FILE_IDENTIFIER      "file_identifier"
 #define TOKEN_STR_LAST_LEVEL_SERIES    "last_level_series"
 #define TOKEN_STR_ALIAS_NAME           "alias_name"