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:
parent
211a172c1d
commit
dd0f639176
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue