Avoid reducing player's highest-level when replaying a non-MRU level

If the level was not the most recently played, a save is forced so that
it can be marked as most recently played.  However, the logic to force
the save also forced an update of the highest-level field, even if that
reduced it.

- Rename the parameter to clarify its meaning.
- Add comments explaining the logic to force the save.
- Only update the highest-level field when the update would increase the saved value
This commit is contained in:
Kp 2019-08-24 04:32:24 +00:00
parent 211a172c1d
commit dd0f639176
2 changed files with 15 additions and 4 deletions

View file

@ -208,7 +208,7 @@ int read_player_file();
// set a new highest level for player for this mission
}
#endif
void set_highest_level(int levelnum);
void set_highest_level(uint8_t levelnum);
// gets the player's highest level from the file for this mission
int get_highest_level(void);

View file

@ -1191,7 +1191,7 @@ static std::array<array<hli, MAX_MISSIONS>::pointer, 2> find_hli_entry(const par
}
//set a new highest level for player for this mission
void set_highest_level(int levelnum)
void set_highest_level(const uint8_t best_levelnum_this_game)
{
int ret;
@ -1248,6 +1248,9 @@ void set_highest_level(int levelnum)
* space available, move everything, so that the
* least-recently-used element (at *irs) is discarded to make
* room to add this mission as most recently used.
*
* Leave previous_best_levelnum set to 0, so that any progress
* at all qualifies for a save.
*/
if (ie == PlayerCfg.HighestLevels.end())
{
@ -1263,16 +1266,24 @@ void set_highest_level(int levelnum)
{
/* If this mission is not the most recently used, reorder the
* list so that it becomes the most recently used.
*
* Leave previous_best_levelnum set to 0, so that a save is
* required, even if the player has not set a new record.
*/
std::rotate(ii, std::next(ii), ie);
ii = ie - 1;
}
else
/* Update previous_best_levelnum so that progress is only saved
* if this is a new best.
*/
previous_best_levelnum = ii->LevelNum;
if (previous_best_levelnum < levelnum)
if (previous_best_levelnum < best_levelnum_this_game)
{
ii->LevelNum = levelnum;
auto &best_levelnum_recorded = ii->LevelNum;
if (best_levelnum_recorded < best_levelnum_this_game)
best_levelnum_recorded = best_levelnum_this_game;
write_player_file();
}
}