added saving tape basename for each high score entry
authorHolger Schemel <info@artsoft.org>
Sun, 4 Apr 2021 12:29:27 +0000 (14:29 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 1 May 2021 13:38:02 +0000 (15:38 +0200)
src/files.c
src/game.c
src/main.h
src/tape.h

index 7bdc35ca474b97862a46c46600288c6c5b8846cb..a4f7f10a786f31803e77ae160a858778a96e86c9 100644 (file)
@@ -8430,6 +8430,7 @@ static void setScoreInfoToDefaults(void)
 
   for (i = 0; i < MAX_SCORE_ENTRIES; i++)
   {
+    strcpy(scores.entry[i].tape_basename, UNDEFINED_FILENAME);
     strcpy(scores.entry[i].name, EMPTY_PLAYER_NAME);
     scores.entry[i].score = 0;
     scores.entry[i].time = 0;
@@ -8582,6 +8583,23 @@ static int LoadScore_TIME(File *file, int chunk_size, struct ScoreInfo *scores)
   return chunk_size;
 }
 
+static int LoadScore_TAPE(File *file, int chunk_size, struct ScoreInfo *scores)
+{
+  int i, j;
+
+  for (i = 0; i < scores->num_entries; i++)
+  {
+    for (j = 0; j < MAX_SCORE_TAPE_BASENAME_LEN; j++)
+      scores->entry[i].tape_basename[j] = getFile8Bit(file);
+
+    scores->entry[i].tape_basename[MAX_SCORE_TAPE_BASENAME_LEN] = '\0';
+  }
+
+  chunk_size = scores->num_entries * MAX_SCORE_TAPE_BASENAME_LEN;
+
+  return chunk_size;
+}
+
 void LoadScore(int nr)
 {
   char *filename = getScoreFilename(nr);
@@ -8655,6 +8673,7 @@ void LoadScore(int nr)
       { "NAME", -1,                    LoadScore_NAME },
       { "SCOR", -1,                    LoadScore_SCOR },
       { "TIME", -1,                    LoadScore_TIME },
+      { "TAPE", -1,                    LoadScore_TAPE },
 
       {  NULL,  0,                     NULL }
     };
@@ -8781,6 +8800,19 @@ static void SaveScore_TIME(FILE *file, struct ScoreInfo *scores)
     putFile32BitBE(file, scores->entry[i].time);
 }
 
+static void SaveScore_TAPE(FILE *file, struct ScoreInfo *scores)
+{
+  int i, j;
+
+  for (i = 0; i < scores->num_entries; i++)
+  {
+    int size = strlen(scores->entry[i].tape_basename);
+
+    for (j = 0; j < MAX_SCORE_TAPE_BASENAME_LEN; j++)
+      putFile8Bit(file, (j < size ? scores->entry[i].tape_basename[j] : 0));
+  }
+}
+
 static void SaveScoreToFilename(char *filename)
 {
   FILE *file;
@@ -8789,6 +8821,7 @@ static void SaveScoreToFilename(char *filename)
   int name_chunk_size;
   int scor_chunk_size;
   int time_chunk_size;
+  int tape_chunk_size;
 
   if (!(file = fopen(filename, MODE_WRITE)))
   {
@@ -8801,6 +8834,7 @@ static void SaveScoreToFilename(char *filename)
   name_chunk_size = scores.num_entries * MAX_PLAYER_NAME_LEN;
   scor_chunk_size = scores.num_entries * 2;
   time_chunk_size = scores.num_entries * 4;
+  tape_chunk_size = scores.num_entries * MAX_SCORE_TAPE_BASENAME_LEN;
 
   putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED);
   putFileChunkBE(file, "SCOR", CHUNK_SIZE_NONE);
@@ -8820,6 +8854,9 @@ static void SaveScoreToFilename(char *filename)
   putFileChunkBE(file, "TIME", time_chunk_size);
   SaveScore_TIME(file, &scores);
 
+  putFileChunkBE(file, "TAPE", tape_chunk_size);
+  SaveScore_TAPE(file, &scores);
+
   fclose(file);
 
   SetFilePermissions(filename, permissions);
index 5c55451699818b4292c31eba598d0a67746cd9c9..2002126623cb737ffc4f103eb36e8d72435e043b 100644 (file)
@@ -5097,6 +5097,7 @@ int NewHiScore(int level_nr)
 
       put_into_list:
 
+      strcpy(entry->tape_basename, tape.score_tape_basename);
       strncpy(entry->name, setup.player_name, MAX_PLAYER_NAME_LEN);
       entry->name[MAX_PLAYER_NAME_LEN] = '\0';
       entry->score = game.score_final;
index 482f7317e5d81b41fd2d0265f520c16e41eefe38..b429c15b992a998188a7a28c8ca32f2e3ee7f629 100644 (file)
@@ -3040,6 +3040,7 @@ struct ViewportInfo
 
 struct ScoreEntry
 {
+  char tape_basename[MAX_FILENAME_LEN + 1];
   char name[MAX_PLAYER_NAME_LEN + 1];
   int score;
   int time;            // time (in frames) or steps played
index 85e1e64cae65420881d923454148f0f34e5415d5..e47328179473d78eaa7e608ec1a6b4ade93178ad 100644 (file)
@@ -39,6 +39,9 @@
 #define TAPE_PROPERTY_NONE             0
 #define TAPE_PROPERTY_EM_RANDOM_BUG    (1 << 0)
 
+// values for score tape basename length (date, time, name hash, no extension)
+#define MAX_SCORE_TAPE_BASENAME_LEN    24
+
 // some positions in the video tape control window
 #define VIDEO_DISPLAY1_XPOS    5
 #define VIDEO_DISPLAY1_YPOS    5