1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Remove main menu global. Now accessed via GameInstance

This commit is contained in:
Ivan Savenko
2025-02-27 22:42:29 +00:00
parent d3de0d525f
commit e5a095a237
11 changed files with 50 additions and 50 deletions

View File

@@ -1801,7 +1801,7 @@ void CPlayerInterface::proposeLoadingGame()
[]()
{
GAME->server().endGameplay();
CMM->menu->switchToTab("load");
GAME->mainmenu()->menu->switchToTab("load");
},
nullptr
);

View File

@@ -15,6 +15,7 @@
#include "GameChatHandler.h"
#include "CPlayerInterface.h"
#include "GameEngine.h"
#include "GameInstance.h"
#include "gui/WindowHandler.h"
#include "globalLobby/GlobalLobbyClient.h"
@@ -610,8 +611,8 @@ void CServerHandler::startMapAfterConnection(std::shared_ptr<CMapInfo> to)
void CServerHandler::startGameplay(VCMI_LIB_WRAP_NAMESPACE(CGameState) * gameState)
{
if(CMM)
CMM->disable();
if(GAME->mainmenu())
GAME->mainmenu()->disable();
switch(si->mode)
{
@@ -649,7 +650,7 @@ void CServerHandler::showHighScoresAndEndGameplay(PlayerColor player, bool victo
scenarioHighScores.isCampaign = false;
endGameplay();
CMM->menu->switchToTab("main");
GAME->mainmenu()->menu->switchToTab("main");
ENGINE->windows().createAndPushWindow<CHighScoreInputScreen>(victory, scenarioHighScores, statistic);
}
}
@@ -664,17 +665,11 @@ void CServerHandler::endGameplay()
client->endGame();
client.reset();
if(CMM)
if (GAME->mainmenu())
{
CMM->enable();
CMM->playMusic();
CMM->makeActiveInterface();
}
else
{
auto mainMenu = CMainMenu::create();
mainMenu->playMusic();
mainMenu->makeActiveInterface();
GAME->mainmenu()->enable();
GAME->mainmenu()->playMusic();
GAME->mainmenu()->makeActiveInterface();
}
}
@@ -710,14 +705,13 @@ void CServerHandler::startCampaignScenario(HighScoreParameter param, std::shared
entry->Bool() = true;
}
ENGINE->windows().pushWindow(CMM);
ENGINE->windows().pushWindow(CMM->menu);
GAME->mainmenu()->makeActiveInterface();
if(!ourCampaign->isCampaignFinished())
CMM->openCampaignLobby(ourCampaign);
GAME->mainmenu()->openCampaignLobby(ourCampaign);
else
{
CMM->openCampaignScreen(ourCampaign->campaignSet);
GAME->mainmenu()->openCampaignScreen(ourCampaign->campaignSet);
if(!ourCampaign->getOutroVideo().empty() && ENGINE->video().open(ourCampaign->getOutroVideo(), 1))
{
ENGINE->music().stopMusic();
@@ -890,7 +884,7 @@ void CServerHandler::onDisconnected(const std::shared_ptr<INetworkConnection> &
if(client)
{
endGameplay();
CMM->menu->switchToTab("main");
GAME->mainmenu()->menu->switchToTab("main");
showServerError(LIBRARY->generaltexth->translate("vcmi.server.errors.disconnected"));
}
else

View File

@@ -14,6 +14,9 @@
#include "CServerHandler.h"
#include "mapView/mapHandler.h"
#include "globalLobby/GlobalLobbyClient.h"
#include "mainmenu/CMainMenu.h"
#include "../lib/CConfigHandler.h"
std::unique_ptr<GameInstance> GAME = nullptr;
@@ -41,6 +44,17 @@ CMapHandler & GameInstance::map()
return *mapInstance;
}
std::shared_ptr<CMainMenu> GameInstance::mainmenu()
{
if(settings["session"]["headless"].Bool())
return nullptr;
if (!mainMenuInstance)
mainMenuInstance = std::shared_ptr<CMainMenu>(new CMainMenu());
return mainMenuInstance;
}
CPlayerInterface * GameInstance::interface()
{
return interfaceInstance;
@@ -58,7 +72,7 @@ void GameInstance::setMapInstance(std::unique_ptr<CMapHandler> ptr)
void GameInstance::setInterfaceInstance(CPlayerInterface * ptr)
{
interfaceInstance = std::move(ptr);
interfaceInstance = ptr;
}
void GameInstance::onGlobalLobbyInterfaceActivated()

View File

@@ -15,6 +15,7 @@ class CServerHandler;
class GlobalLobbyClient;
class CPlayerInterface;
class CMapHandler;
class CMainMenu;
VCMI_LIB_NAMESPACE_BEGIN
class INetworkHandler;
@@ -24,6 +25,7 @@ class GameInstance final : boost::noncopyable, public IGameEngineUser
{
std::unique_ptr<CServerHandler> serverInstance;
std::unique_ptr<CMapHandler> mapInstance;
std::shared_ptr<CMainMenu> mainMenuInstance;
CPlayerInterface * interfaceInstance;
public:
@@ -33,6 +35,7 @@ public:
CServerHandler & server();
CMapHandler & map();
std::shared_ptr<CMainMenu> mainmenu();
CPlayerInterface * interface();
void setServerInstance(std::unique_ptr<CServerHandler> ptr);

View File

@@ -331,7 +331,7 @@ void AdventureMapShortcuts::toMainMenu()
[]()
{
GAME->server().endGameplay();
CMM->menu->switchToTab("main");
GAME->mainmenu()->menu->switchToTab("main");
},
0
);
@@ -344,7 +344,7 @@ void AdventureMapShortcuts::newGame()
[]()
{
GAME->server().endGameplay();
CMM->menu->switchToTab("new");
GAME->mainmenu()->menu->switchToTab("new");
},
nullptr
);

View File

@@ -398,7 +398,7 @@ void CBonusSelection::goBack()
if(GAME->server().getState() != EClientState::GAMEPLAY)
{
ENGINE->windows().popWindows(2);
CMM->playMusic();
GAME->mainmenu()->playMusic();
}
else
{

View File

@@ -14,6 +14,7 @@
#include "CStatisticScreen.h"
#include "CMainMenu.h"
#include "../GameEngine.h"
#include "../GameInstance.h"
#include "../gui/WindowHandler.h"
#include "../gui/Shortcut.h"
#include "../media/IMusicPlayer.h"
@@ -169,7 +170,7 @@ void CHighScoreScreen::buttonResetClick()
void CHighScoreScreen::buttonExitClick()
{
close();
CMM->playMusic();
GAME->mainmenu()->playMusic();
}
void CHighScoreScreen::showAll(Canvas & to)
@@ -221,7 +222,7 @@ CHighScoreInputScreen::CHighScoreInputScreen(bool won, HighScoreCalculation calc
void CHighScoreInputScreen::stopMusicAndClose()
{
CMM->playMusic();
GAME->mainmenu()->playMusic();
close();
}

View File

@@ -61,7 +61,6 @@
#include "../../lib/CRandomGenerator.h"
#include "../../lib/GameLibrary.h"
std::shared_ptr<CMainMenu> CMM;
ISelectionScreenInfo * SEL = nullptr;
static void do_quit()
@@ -171,7 +170,7 @@ static std::function<void()> genCommand(CMenuScreen * menu, std::vector<std::str
}
case 1: //open campaign selection window
{
return std::bind(&CMainMenu::openCampaignScreen, CMM, commands.front());
return std::bind(&CMainMenu::openCampaignScreen, GAME->mainmenu(), commands.front());
break;
}
case 2: //start
@@ -384,7 +383,7 @@ void CMainMenu::onScreenResize()
void CMainMenu::makeActiveInterface()
{
ENGINE->windows().pushWindow(CMM);
ENGINE->windows().pushWindow(GAME->mainmenu());
ENGINE->windows().pushWindow(menu);
menu->switchToTab(menu->getActiveTab());
}
@@ -461,14 +460,6 @@ void CMainMenu::openHighScoreScreen()
return;
}
std::shared_ptr<CMainMenu> CMainMenu::create()
{
if(!CMM)
CMM = std::shared_ptr<CMainMenu>(new CMainMenu());
return CMM;
}
std::shared_ptr<CPicture> CMainMenu::createPicture(const JsonNode & config)
{
return std::make_shared<CPicture>(ImagePath::fromJson(config["name"]), (int)config["x"].Float(), (int)config["y"].Float());

View File

@@ -139,15 +139,15 @@ private:
};
/// Handles background screen, loads graphics for victory/loss condition and random town or hero selection
class CMainMenu : public CIntObject, public std::enable_shared_from_this<CMainMenu>
class CMainMenu final : public CIntObject, public std::enable_shared_from_this<CMainMenu>
{
std::shared_ptr<CFilledTexture> backgroundAroundMenu;
std::vector<VideoPath> videoPlayList;
CMainMenu(); //Use CMainMenu::create
public:
CMainMenu();
std::shared_ptr<CMenuScreen> menu;
~CMainMenu();
@@ -161,8 +161,6 @@ public:
static void openHighScoreScreen();
void openCampaignScreen(std::string name);
static std::shared_ptr<CMainMenu> create();
static std::shared_ptr<CPicture> createPicture(const JsonNode & config);
void playIntroVideos();
@@ -203,4 +201,4 @@ public:
void tick(uint32_t msPassed) override;
};
extern std::shared_ptr<CMainMenu> CMM;

View File

@@ -147,7 +147,7 @@ void SettingsMainWindow::mainMenuButtonCallback()
{
close();
GAME->server().endGameplay();
CMM->menu->switchToTab("main");
GAME->mainmenu()->menu->switchToTab("main");
},
0
);

View File

@@ -371,16 +371,15 @@ int main(int argc, char * argv[])
session["onlyai"].Bool() = true;
boost::thread(&CServerHandler::debugStartTest, &GAME->server(), session["testsave"].String(), true);
}
else
else if (!settings["session"]["headless"].Bool())
{
auto mmenu = CMainMenu::create();
mmenu->makeActiveInterface();
GAME->mainmenu()->makeActiveInterface();
bool playIntroVideo = !settings["session"]["headless"].Bool() && !vm.count("battle") && !vm.count("nointro") && settings["video"]["showIntro"].Bool();
bool playIntroVideo = !vm.count("battle") && !vm.count("nointro") && settings["video"]["showIntro"].Bool();
if(playIntroVideo)
mmenu->playIntroVideos();
GAME->mainmenu()->playIntroVideos();
else
mmenu->playMusic();
GAME->mainmenu()->playMusic();
}
std::vector<std::string> names;
@@ -444,7 +443,7 @@ static void mainLoop()
}
GAME.reset();
CMM.reset();
GAME->mainmenu().reset();
if(!settings["session"]["headless"].Bool())
{