added level editor option to sort high scores by playing time (or steps)
[rocksndiamonds.git] / src / files.c
index 9bbe3bc678e19974767ddb80555dbe5e9c50217c..133a2d2609b2515de8b5eeb3edf82d34ae65a798 100644 (file)
@@ -266,6 +266,12 @@ static struct LevelFileConfigInfo chunk_config_INFO[] =
     &li.time_score_base,               1
   },
 
+  {
+    -1,                                        -1,
+    TYPE_BOOLEAN,                      CONF_VALUE_8_BIT(13),
+    &li.rate_time_over_score,          FALSE
+  },
+
   {
     -1,                                        -1,
     -1,                                        -1,
@@ -8388,8 +8394,9 @@ static void setScoreInfoToDefaults(void)
 
   for (i = 0; i < MAX_SCORE_ENTRIES; i++)
   {
-    strcpy(highscore[i].Name, EMPTY_PLAYER_NAME);
-    highscore[i].Score = 0;
+    strcpy(scores.entry[i].name, EMPTY_PLAYER_NAME);
+    scores.entry[i].score = 0;
+    scores.entry[i].time = 0;
   }
 }
 
@@ -8422,7 +8429,7 @@ static void LoadScore_OLD(int nr)
 
   for (i = 0; i < MAX_SCORE_ENTRIES; i++)
   {
-    if (fscanf(file, "%d", &highscore[i].Score) == EOF)
+    if (fscanf(file, "%d", &scores.entry[i].score) == EOF)
       Warn("fscanf() failed; %s", strerror(errno));
 
     if (fgets(line, MAX_LINE_LEN, file) == NULL)
@@ -8435,8 +8442,8 @@ static void LoadScore_OLD(int nr)
     {
       if (*line_ptr != ' ' && *line_ptr != '\t' && *line_ptr != '\0')
       {
-       strncpy(highscore[i].Name, line_ptr, MAX_PLAYER_NAME_LEN);
-       highscore[i].Name[MAX_PLAYER_NAME_LEN] = '\0';
+       strncpy(scores.entry[i].name, line_ptr, MAX_PLAYER_NAME_LEN);
+       scores.entry[i].name[MAX_PLAYER_NAME_LEN] = '\0';
        break;
       }
     }
@@ -8486,9 +8493,9 @@ static int LoadScore_NAME(File *file, int chunk_size, struct ScoreInfo *scores)
   for (i = 0; i < scores->num_entries; i++)
   {
     for (j = 0; j < MAX_PLAYER_NAME_LEN; j++)
-      highscore[i].Name[j] = getFile8Bit(file);
+      scores->entry[i].name[j] = getFile8Bit(file);
 
-    highscore[i].Name[MAX_PLAYER_NAME_LEN] = '\0';
+    scores->entry[i].name[MAX_PLAYER_NAME_LEN] = '\0';
   }
 
   chunk_size = scores->num_entries * MAX_PLAYER_NAME_LEN;
@@ -8501,13 +8508,25 @@ static int LoadScore_SCOR(File *file, int chunk_size, struct ScoreInfo *scores)
   int i;
 
   for (i = 0; i < scores->num_entries; i++)
-    highscore[i].Score = getFile16BitBE(file);
+    scores->entry[i].score = getFile16BitBE(file);
 
   chunk_size = scores->num_entries * 2;
 
   return chunk_size;
 }
 
+static int LoadScore_TIME(File *file, int chunk_size, struct ScoreInfo *scores)
+{
+  int i;
+
+  for (i = 0; i < scores->num_entries; i++)
+    scores->entry[i].time = getFile32BitBE(file);
+
+  chunk_size = scores->num_entries * 4;
+
+  return chunk_size;
+}
+
 void LoadScore(int nr)
 {
   char *filename = getScoreFilename(nr);
@@ -8577,6 +8596,7 @@ void LoadScore(int nr)
       { "INFO", -1,                    LoadScore_INFO },
       { "NAME", -1,                    LoadScore_NAME },
       { "SCOR", -1,                    LoadScore_SCOR },
+      { "TIME", -1,                    LoadScore_TIME },
 
       {  NULL,  0,                     NULL }
     };
@@ -8646,7 +8666,7 @@ void SaveScore_OLD(int nr)
   fprintf(file, "%s\n\n", SCORE_COOKIE);
 
   for (i = 0; i < MAX_SCORE_ENTRIES; i++)
-    fprintf(file, "%d %s\n", highscore[i].Score, highscore[i].Name);
+    fprintf(file, "%d %s\n", scores.entry[i].score, scores.entry[i].name);
 
   fclose(file);
 
@@ -8680,10 +8700,10 @@ static void SaveScore_NAME(FILE *file, struct ScoreInfo *scores)
 
   for (i = 0; i < scores->num_entries; i++)
   {
-    int name_size = strlen(highscore[i].Name);
+    int name_size = strlen(scores->entry[i].name);
 
     for (j = 0; j < MAX_PLAYER_NAME_LEN; j++)
-      putFile8Bit(file, (j < name_size ? highscore[i].Name[j] : 0));
+      putFile8Bit(file, (j < name_size ? scores->entry[i].name[j] : 0));
   }
 }
 
@@ -8692,7 +8712,15 @@ static void SaveScore_SCOR(FILE *file, struct ScoreInfo *scores)
   int i;
 
   for (i = 0; i < scores->num_entries; i++)
-    putFile16BitBE(file, highscore[i].Score);
+    putFile16BitBE(file, scores->entry[i].score);
+}
+
+static void SaveScore_TIME(FILE *file, struct ScoreInfo *scores)
+{
+  int i;
+
+  for (i = 0; i < scores->num_entries; i++)
+    putFile32BitBE(file, scores->entry[i].time);
 }
 
 static void SaveScoreToFilename(char *filename)
@@ -8702,6 +8730,7 @@ static void SaveScoreToFilename(char *filename)
   int info_chunk_size;
   int name_chunk_size;
   int scor_chunk_size;
+  int time_chunk_size;
 
   if (!(file = fopen(filename, MODE_WRITE)))
   {
@@ -8713,6 +8742,7 @@ static void SaveScoreToFilename(char *filename)
   info_chunk_size = 2 + (strlen(scores.level_identifier) + 1) + 2 + 2;
   name_chunk_size = scores.num_entries * MAX_PLAYER_NAME_LEN;
   scor_chunk_size = scores.num_entries * 2;
+  time_chunk_size = scores.num_entries * 4;
 
   putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED);
   putFileChunkBE(file, "SCOR", CHUNK_SIZE_NONE);
@@ -8729,6 +8759,9 @@ static void SaveScoreToFilename(char *filename)
   putFileChunkBE(file, "SCOR", scor_chunk_size);
   SaveScore_SCOR(file, &scores);
 
+  putFileChunkBE(file, "TIME", time_chunk_size);
+  SaveScore_TIME(file, &scores);
+
   fclose(file);
 
   SetFilePermissions(filename, permissions);
@@ -8750,8 +8783,9 @@ void SaveScore(int nr)
   scores.level_nr = level_nr;
 
   for (i = 0; i < MAX_SCORE_ENTRIES; i++)
-    if (highscore[i].Score == 0 &&
-        strEqual(highscore[i].Name, EMPTY_PLAYER_NAME))
+    if (scores.entry[i].score == 0 &&
+        scores.entry[i].time == 0 &&
+        strEqual(scores.entry[i].name, EMPTY_PLAYER_NAME))
       break;
 
   scores.num_entries = i;