added storing next level to play from hall of fame
[rocksndiamonds.git] / src / game.c
index 726e60ac26faff6f70a5331e8e73f5a092ddf67e..259d19b6c54f858bee6ca6701bd6ce5b64ec94fd 100644 (file)
@@ -5050,6 +5050,9 @@ void GameEnd(void)
 
     if (setup.auto_play_next_level)
     {
+      scores.continue_playing = TRUE;
+      scores.next_level_nr = level_nr;
+
       LoadLevel(level_nr);
 
       SaveLevelSetup_SeriesInfo();
@@ -5062,9 +5065,7 @@ void GameEnd(void)
 
     DrawHallOfFame(last_level_nr);
   }
-  else if (setup.auto_play_next_level && setup.increment_levels &&
-          last_level_nr < leveldir_current->last_level &&
-          !network_playing)
+  else if (scores.continue_playing)
   {
     StartGameActions(network.enabled, setup.autorecord, level.random_seed);
   }
@@ -5151,7 +5152,8 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry,
     }
   }
 
-  return -1;
+  // special case: new score is beyond the last high score list position
+  return MAX_SCORE_ENTRIES;
 }
 
 void NewHighScore(int level_nr, boolean tape_saved)
@@ -5169,6 +5171,19 @@ void NewHighScore(int level_nr, boolean tape_saved)
 
   scores.last_added = addScoreEntry(&scores, &new_entry, one_per_name);
 
+  if (scores.last_added >= MAX_SCORE_ENTRIES)
+  {
+    scores.last_added = MAX_SCORE_ENTRIES - 1;
+    scores.force_last_added = TRUE;
+
+    scores.entry[scores.last_added] = new_entry;
+
+    // store last added local score entry (before merging server scores)
+    scores.last_added_local = scores.last_added;
+
+    return;
+  }
+
   if (scores.last_added < 0)
     return;
 
@@ -13238,9 +13253,6 @@ void ScrollPlayer(struct PlayerInfo *player, int mode)
       }
     }
 
-    player->last_jx = jx;
-    player->last_jy = jy;
-
     if (Tile[jx][jy] == EL_EXIT_OPEN ||
        Tile[jx][jy] == EL_EM_EXIT_OPEN ||
        Tile[jx][jy] == EL_EM_EXIT_OPENING ||
@@ -13258,6 +13270,9 @@ void ScrollPlayer(struct PlayerInfo *player, int mode)
        LevelSolved();
     }
 
+    player->last_jx = jx;
+    player->last_jy = jy;
+
     // this breaks one level: "machine", level 000
     {
       int move_direction = player->MovDir;