1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-02-09 13:14:02 +02:00

Fix "Start game" blocking status:

- Start game is now initially blocked
- Receiving valid startInfo from server will unlock button
This commit is contained in:
Ivan Savenko 2023-09-11 19:39:32 +03:00
parent 60cbb939ab
commit 538665fe42
5 changed files with 39 additions and 33 deletions

View File

@ -573,17 +573,35 @@ void CServerHandler::sendRestartGame() const
sendLobbyPack(endGame); sendLobbyPack(endGame);
} }
void CServerHandler::sendStartGame(bool allowOnlyAI) const bool CServerHandler::validateGameStart(bool allowOnlyAI) const
{ {
try try
{ {
verifyStateBeforeStart(allowOnlyAI ? true : settings["session"]["onlyai"].Bool()); verifyStateBeforeStart(allowOnlyAI ? true : settings["session"]["onlyai"].Bool());
} }
catch (const std::exception & e) catch(CModHandler::Incompatibility & e)
{ {
showServerError( std::string("Unable to start map! Reason: ") + e.what()); logGlobal->warn("Incompatibility exception during start scenario: %s", e.what());
return;
auto errorMsg = CGI->generaltexth->translate("vcmi.server.errors.modsIncompatibility") + '\n';
errorMsg += e.what();
showServerError(errorMsg);
return false;
} }
catch(std::exception & e)
{
logGlobal->error("Exception during startScenario: %s", e.what());
showServerError( std::string("Unable to start map! Reason: ") + e.what());
return false;
}
return true;
}
void CServerHandler::sendStartGame(bool allowOnlyAI) const
{
verifyStateBeforeStart(allowOnlyAI ? true : settings["session"]["onlyai"].Bool());
LobbyStartGame lsg; LobbyStartGame lsg;
if(client) if(client)
@ -708,7 +726,7 @@ void CServerHandler::startCampaignScenario(std::shared_ptr<CampaignState> cs)
}); });
} }
void CServerHandler::showServerError(std::string txt) const void CServerHandler::showServerError(const std::string & txt) const
{ {
CInfoWindow::showInfoDialog(txt, {}); CInfoWindow::showInfoDialog(txt, {});
} }

View File

@ -148,16 +148,17 @@ public:
void sendRestartGame() const override; void sendRestartGame() const override;
void sendStartGame(bool allowOnlyAI = false) const override; void sendStartGame(bool allowOnlyAI = false) const override;
bool validateGameStart(bool allowOnlyAI = false) const;
void startGameplay(VCMI_LIB_WRAP_NAMESPACE(CGameState) * gameState = nullptr); void startGameplay(VCMI_LIB_WRAP_NAMESPACE(CGameState) * gameState = nullptr);
void endGameplay(bool closeConnection = true, bool restart = false); void endGameplay(bool closeConnection = true, bool restart = false);
void startCampaignScenario(std::shared_ptr<CampaignState> cs = {}); void startCampaignScenario(std::shared_ptr<CampaignState> cs = {});
void showServerError(std::string txt) const; void showServerError(const std::string & txt) const;
// TODO: LobbyState must be updated within game so we should always know how many player interfaces our client handle // TODO: LobbyState must be updated within game so we should always know how many player interfaces our client handle
int howManyPlayerInterfaces(); int howManyPlayerInterfaces();
ui8 getLoadMode(); ui8 getLoadMode();
void debugStartTest(std::string filename, bool save = false);
void restoreLastSession(); void restoreLastSession();
void visitForLobby(CPackForLobby & lobbyPack); void visitForLobby(CPackForLobby & lobbyPack);

View File

@ -102,7 +102,10 @@ void ApplyOnLobbyHandlerNetPackVisitor::visitLobbyEndGame(LobbyEndGame & pack)
} }
if(pack.restart) if(pack.restart)
handler.sendStartGame(); {
if (handler.validateGameStart())
handler.sendStartGame();
}
} }
void ApplyOnLobbyHandlerNetPackVisitor::visitLobbyStartGame(LobbyStartGame & pack) void ApplyOnLobbyHandlerNetPackVisitor::visitLobbyStartGame(LobbyStartGame & pack)

View File

@ -343,7 +343,7 @@ void CBonusSelection::updateAfterStateChange()
{ {
buttonStart->block(getCampaign()->scenario(CSH->campaignMap).travelOptions.bonusesToChoose.size()); buttonStart->block(getCampaign()->scenario(CSH->campaignMap).travelOptions.bonusesToChoose.size());
} }
else if(buttonStart->isBlocked()) else
{ {
buttonStart->block(false); buttonStart->block(false);
} }
@ -390,6 +390,9 @@ void CBonusSelection::goBack()
void CBonusSelection::startMap() void CBonusSelection::startMap()
{ {
if (!CSH->validateGameStart())
return;
auto showPrologVideo = [=]() auto showPrologVideo = [=]()
{ {
auto exitCb = [=]() auto exitCb = [=]()

View File

@ -88,6 +88,8 @@ CLobbyScreen::CLobbyScreen(ESelectionScreen screenType)
break; break;
} }
buttonStart->block(true); // to be unblocked after map list is ready
buttonBack = std::make_shared<CButton>(Point(581, 535), "SCNRBACK.DEF", CGI->generaltexth->zelp[105], [&]() buttonBack = std::make_shared<CButton>(Point(581, 535), "SCNRBACK.DEF", CGI->generaltexth->zelp[105], [&]()
{ {
CSH->sendClientDisconnecting(); CSH->sendClientDisconnecting();
@ -126,34 +128,11 @@ void CLobbyScreen::startCampaign()
void CLobbyScreen::startScenario(bool allowOnlyAI) void CLobbyScreen::startScenario(bool allowOnlyAI)
{ {
try if (CSH->validateGameStart(allowOnlyAI))
{ {
CSH->sendStartGame(allowOnlyAI); CSH->sendStartGame(allowOnlyAI);
buttonStart->block(true); buttonStart->block(true);
} }
catch(CModHandler::Incompatibility & e)
{
logGlobal->warn("Incompatibility exception during start scenario: %s", e.what());
auto errorMsg = CGI->generaltexth->translate("vcmi.server.errors.modsIncompatibility") + '\n';
errorMsg += e.what();
CInfoWindow::showInfoDialog(errorMsg, CInfoWindow::TCompsInfo(), PlayerColor(1));
}
catch(std::exception & e)
{
logGlobal->error("Exception during startScenario: %s", e.what());
if(std::string(e.what()) == "ExceptionNoHuman")
CInfoWindow::showInfoDialog(CGI->generaltexth->allTexts[530], CInfoWindow::TCompsInfo(), PlayerColor(1));
if(std::string(e.what()) == "ExceptionNoTemplate")
CInfoWindow::showInfoDialog(CGI->generaltexth->allTexts[751], CInfoWindow::TCompsInfo(), PlayerColor(1));
}
catch(...)
{
logGlobal->error("Unknown exception");
}
} }
void CLobbyScreen::toggleMode(bool host) void CLobbyScreen::toggleMode(bool host)
@ -192,6 +171,8 @@ void CLobbyScreen::updateAfterStateChange()
if(CSH->mi && tabOpt) if(CSH->mi && tabOpt)
tabOpt->recreate(); tabOpt->recreate();
buttonStart->block(CSH->mi == nullptr || CSH->isGuest());
card->changeSelection(); card->changeSelection();
if (card->iconDifficulty) if (card->iconDifficulty)
{ {