MCPcopy Create free account
hub / github.com/deathkiller/jazz2-native / ChangeLevel

Method ChangeLevel

Sources/Main.cpp:626–750  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

624}
625
626void 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);

Callers

nothing calls this directly

Calls 7

_Function · 0.85
GetEpisodeMethod · 0.80
HandleEndOfGameMethod · 0.80
partitionMethod · 0.45
emptyMethod · 0.45
DisposeMethod · 0.45
InvokeAsyncMethod · 0.45

Tested by

no test coverage detected