2
0
nordsoft 2 жил өмнө
parent
commit
fb4db41891

+ 1 - 1
client/CServerHandler.h

@@ -146,7 +146,7 @@ public:
 	void sendMessage(const std::string & txt) const override;
 	void sendGuiAction(ui8 action) const override;
 	void sendRestartGame() const override;
-	void sendStartGame(bool allowOnlyAI = false) const override;
+	void sendStartGame(bool allowOnlyAI = true) const override;
 
 	void startGameplay(VCMI_LIB_WRAP_NAMESPACE(CGameState) * gameState = nullptr);
 	void endGameplay(bool closeConnection = true, bool restart = false);

+ 20 - 13
client/Client.cpp

@@ -401,18 +401,23 @@ void CClient::initPlayerEnvironments()
 	playerEnvironments.clear();
 
 	auto allPlayers = CSH->getAllClientPlayers(CSH->c->connectionID);
-	if(allPlayers.empty())
-	{
-		Settings session = settings.write["session"];
-		session["spectate"].Bool() = true;
-	}
-	
+	bool hasHumanPlayer = false;
 	for(auto & color : allPlayers)
 	{
 		logNetwork->info("Preparing environment for player %s", color.getStr());
 		playerEnvironments[color] = std::make_shared<CPlayerEnvironment>(color, this, std::make_shared<CCallback>(gs, color, this));
+		
+		if(!hasHumanPlayer && gs->players[color].isHuman())
+			hasHumanPlayer = true;
 	}
 
+	if(!hasHumanPlayer)
+	{
+		Settings session = settings.write["session"];
+		session["spectate"].Bool() = true;
+		session["spectate-skip-battle-result"].Bool() = true;
+	}
+	
 	if(settings["session"]["spectate"].Bool())
 	{
 		playerEnvironments[PlayerColor::SPECTATOR] = std::make_shared<CPlayerEnvironment>(PlayerColor::SPECTATOR, this, std::make_shared<CCallback>(gs, boost::none, this));
@@ -581,27 +586,29 @@ void CClient::battleStarted(const BattleInfo * info)
 	if(vstd::contains(playerint, rightSide.color) && playerint[rightSide.color]->human)
 		def = std::dynamic_pointer_cast<CPlayerInterface>(playerint[rightSide.color]);
 	
+	auto spectratorInterface = std::dynamic_pointer_cast<CPlayerInterface>(playerint[PlayerColor::SPECTATOR]);
+	
 	//Remove player interfaces for auto battle (quickCombat option)
 	if(att && att->isAutoFightOn)
 	{
 		att.reset();
 		def.reset();
+		spectratorInterface.reset();
 	}
-
-	if(!settings["session"]["headless"].Bool())
+	else if(!settings["session"]["headless"].Bool())
 	{
 		if(!!att || !!def)
 		{
 			boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
 			CPlayerInterface::battleInt = std::make_shared<BattleInterface>(leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def);
 		}
-		else if(settings["session"]["spectate"].Bool() && !settings["session"]["spectate-skip-battle"].Bool())
+		else if(false && settings["session"]["spectate"].Bool() && !settings["session"]["spectate-skip-battle"].Bool())
 		{
+			//spectator for AI-only battles
 			//TODO: This certainly need improvement
-			auto spectratorInt = std::dynamic_pointer_cast<CPlayerInterface>(playerint[PlayerColor::SPECTATOR]);
-			spectratorInt->cb->setBattle(info);
+			spectratorInterface->cb->setBattle(info);
 			boost::unique_lock<boost::recursive_mutex> un(*CPlayerInterface::pim);
-			CPlayerInterface::battleInt = std::make_shared<BattleInterface>(leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def, spectratorInt);
+			CPlayerInterface::battleInt = std::make_shared<BattleInterface>(leftSide.armyObject, rightSide.armyObject, leftSide.hero, rightSide.hero, att, def, spectratorInterface);
 		}
 	}
 
@@ -637,7 +644,7 @@ void CClient::battleFinished()
 		if(battleCallbacks.count(side.color))
 			battleCallbacks[side.color]->setBattle(nullptr);
 
-	if(settings["session"]["spectate"].Bool() && !settings["session"]["spectate-skip-battle"].Bool())
+	if(battleCallbacks[PlayerColor::SPECTATOR])
 		battleCallbacks[PlayerColor::SPECTATOR]->setBattle(nullptr);
 
 	setBattle(nullptr);

+ 2 - 2
client/lobby/CLobbyScreen.cpp

@@ -69,14 +69,14 @@ CLobbyScreen::CLobbyScreen(ESelectionScreen screenType)
 
 		card->iconDifficulty->addCallback(std::bind(&IServerAPI::setDifficulty, CSH, _1));
 
-		buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRBEG.DEF", CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, false), SDLK_b);
+		buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRBEG.DEF", CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, true), SDLK_b);
 		initLobby();
 		break;
 	}
 	case ESelectionScreen::loadGame:
 	{
 		tabOpt = std::make_shared<OptionsTab>();
-		buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRLOD.DEF", CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, false), SDLK_l);
+		buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRLOD.DEF", CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, true), SDLK_l);
 		initLobby();
 		break;
 	}

+ 1 - 1
client/lobby/CLobbyScreen.h

@@ -22,7 +22,7 @@ public:
 	~CLobbyScreen();
 	void toggleTab(std::shared_ptr<CIntObject> tab) override;
 	void startCampaign();
-	void startScenario(bool allowOnlyAI = false);
+	void startScenario(bool allowOnlyAI = true);
 	void toggleMode(bool host);
 	void toggleChat();
 

+ 1 - 1
client/lobby/OptionsTab.cpp

@@ -514,7 +514,7 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, con
 
 void OptionsTab::onSetPlayerClicked(const PlayerSettings & ps) const
 {
-	if(ps.isControlledByAI() || humanPlayers > 1)
+	if(ps.isControlledByAI() || humanPlayers > 0)
 		CSH->setPlayer(ps.color);
 }