| 2039 | } |
| 2040 | |
| 2041 | void GameEventHandler::SaveEpisodeEnd(const LevelInitialization& levelInit) |
| 2042 | { |
| 2043 | if (levelInit.LastEpisodeName.empty() || levelInit.LastEpisodeName == "unknown"_s) { |
| 2044 | return; |
| 2045 | } |
| 2046 | |
| 2047 | const PlayerCarryOver* firstPlayer; |
| 2048 | std::size_t playerCount = levelInit.GetPlayerCount(&firstPlayer); |
| 2049 | |
| 2050 | PreferencesCache::RemoveEpisodeContinue(levelInit.LastEpisodeName); |
| 2051 | |
| 2052 | if (playerCount > 0) { |
| 2053 | auto* prevEnd = PreferencesCache::GetEpisodeEnd(levelInit.LastEpisodeName); |
| 2054 | |
| 2055 | bool shouldSaveEpisodeEnd = (prevEnd == nullptr); |
| 2056 | if (!shouldSaveEpisodeEnd) { |
| 2057 | switch (PreferencesCache::OverwriteEpisodeEnd) { |
| 2058 | // Don't overwrite existing data in multiplayer/split-screen |
| 2059 | default: shouldSaveEpisodeEnd = (playerCount == 1); break; |
| 2060 | case EpisodeEndOverwriteMode::NoCheatsOnly: shouldSaveEpisodeEnd = (playerCount == 1 && !levelInit.CheatsUsed); break; |
| 2061 | case EpisodeEndOverwriteMode::HigherScoreOnly: shouldSaveEpisodeEnd = (playerCount == 1 && !levelInit.CheatsUsed && firstPlayer->Score >= prevEnd->Score); break; |
| 2062 | } |
| 2063 | } |
| 2064 | |
| 2065 | if (shouldSaveEpisodeEnd) { |
| 2066 | auto* episodeEnd = PreferencesCache::GetEpisodeEnd(levelInit.LastEpisodeName, true); |
| 2067 | episodeEnd->Flags = EpisodeContinuationFlags::IsCompleted; |
| 2068 | if (levelInit.CheatsUsed) { |
| 2069 | episodeEnd->Flags |= EpisodeContinuationFlags::CheatsUsed; |
| 2070 | } |
| 2071 | |
| 2072 | episodeEnd->Lives = firstPlayer->Lives; |
| 2073 | episodeEnd->Score = firstPlayer->Score; |
| 2074 | episodeEnd->ElapsedMilliseconds = levelInit.ElapsedMilliseconds; |
| 2075 | std::memcpy(episodeEnd->Gems, firstPlayer->Gems, sizeof(firstPlayer->Gems)); |
| 2076 | std::memcpy(episodeEnd->Ammo, firstPlayer->Ammo, sizeof(firstPlayer->Ammo)); |
| 2077 | std::memcpy(episodeEnd->WeaponUpgrades, firstPlayer->WeaponUpgrades, sizeof(firstPlayer->WeaponUpgrades)); |
| 2078 | } |
| 2079 | } |
| 2080 | |
| 2081 | PreferencesCache::Save(); |
| 2082 | } |
| 2083 | |
| 2084 | void GameEventHandler::SaveEpisodeContinue(const LevelInitialization& levelInit) |
| 2085 | { |
nothing calls this directly
no test coverage detected