| 624 | } |
| 625 | |
| 626 | void GameEventHandler::ChangeLevel(LevelInitialization&& levelInit) |
| 627 | { |
| 628 | InvokeAsync([this, levelInit = std::move(levelInit)]() mutable { |
| 629 | ZoneScopedNC("GameEventHandler::ChangeLevel", 0x888888); |
| 630 | |
| 631 | auto p = levelInit.LevelName.partition('/'); |
| 632 | auto levelName = (!p[2].empty() ? p[2] : p[0]); |
| 633 | |
| 634 | std::shared_ptr<IStateHandler> newHandler; |
| 635 | if (levelInit.LevelName.empty()) { |
| 636 | // Next level not specified, so show main menu |
| 637 | InGameConsole::Clear(); |
| 638 | newHandler = std::make_shared<Menu::MainMenu>(this, false); |
| 639 | #if defined(WITH_MULTIPLAYER) |
| 640 | // TODO: This should show some server console instead of exiting |
| 641 | if (_networkManager != nullptr) { |
| 642 | LOGW("Failed to load level \"{}\", disposing network manager", levelInit.LevelName); |
| 643 | |
| 644 | _networkManager->Dispose(); |
| 645 | _networkManager = nullptr; |
| 646 | _streamedAsset = nullptr; |
| 647 | } |
| 648 | #endif |
| 649 | } else if (levelName == ":end"_s) { |
| 650 | // End of episode |
| 651 | SaveEpisodeEnd(levelInit); |
| 652 | |
| 653 | auto& resolver = ContentResolver::Get(); |
| 654 | std::optional<Episode> lastEpisode = resolver.GetEpisode(levelInit.LastEpisodeName); |
| 655 | if (lastEpisode) { |
| 656 | // Redirect to next episode |
| 657 | if (std::optional<Episode> nextEpisode = resolver.GetEpisode(lastEpisode->NextEpisode)) { |
| 658 | levelInit.LevelName = lastEpisode->NextEpisode + '/' + nextEpisode->FirstLevel; |
| 659 | |
| 660 | p = levelInit.LevelName.partition('/'); |
| 661 | levelName = (!p[2].empty() ? p[2] : p[0]); |
| 662 | } |
| 663 | } |
| 664 | |
| 665 | if (levelName != ":end"_s) { |
| 666 | if (!SetLevelHandler(levelInit)) { |
| 667 | InGameConsole::Clear(); |
| 668 | auto mainMenu = std::make_shared<Menu::MainMenu>(this, false); |
| 669 | mainMenu->SwitchToSection<Menu::SimpleMessageSection>(_("\f[c:#704a4a]Cannot load specified level!\f[/c]\n\n\nMake sure all necessary files\nare accessible and try it again."), true); |
| 670 | newHandler = std::move(mainMenu); |
| 671 | #if defined(WITH_MULTIPLAYER) |
| 672 | // TODO: This should show some server console instead of exiting |
| 673 | if (_networkManager != nullptr) { |
| 674 | LOGW("Failed to load level \"{}\", disposing network manager", levelInit.LevelName); |
| 675 | |
| 676 | _networkManager->Dispose(); |
| 677 | _networkManager = nullptr; |
| 678 | _streamedAsset = nullptr; |
| 679 | } |
| 680 | #endif |
| 681 | } |
| 682 | } else { |
| 683 | HandleEndOfGame(levelInit, false); |
nothing calls this directly
no test coverage detected