浏览代码

- Fixed mantis #1421
- Fixed initial map selection in campaign bonus screen

beegee1 12 年之前
父节点
当前提交
61fc216a6f
共有 3 个文件被更改,包括 48 次插入16 次删除
  1. 8 4
      client/CPreGame.cpp
  2. 39 12
      server/CGameHandler.cpp
  3. 1 0
      server/CGameHandler.h

+ 8 - 4
client/CPreGame.cpp

@@ -3186,16 +3186,20 @@ void CBonusSelection::init()
 	bonuses = new CHighlightableButtonsGroup(bind(&CBonusSelection::selectBonus, this, _1));
 
 	//set left part of window
-	for (int g=0; g<ourCampaign->camp->scenarios.size(); ++g)
+	bool isCurrentMapConquerable = ourCampaign->currentMap && ourCampaign->camp->conquerable(*ourCampaign->currentMap);
+	for(int g = 0; g < ourCampaign->camp->scenarios.size(); ++g)
 	{
 		if(ourCampaign->camp->conquerable(g))
 		{
 			regions.push_back(new CRegion(this, true, true, g));
 			regions[regions.size()-1]->rclickText = ourCampaign->camp->scenarios[g].regionText;
-			if (highlightedRegion == nullptr)
+			if(highlightedRegion == nullptr)
 			{
-				highlightedRegion = regions.back();
-				selectMap(g, true);
+				if(!isCurrentMapConquerable || (isCurrentMapConquerable && g == *ourCampaign->currentMap))
+				{
+					highlightedRegion = regions.back();
+					selectMap(g, true);
+				}
 			}
 		}
 		else if (ourCampaign->camp->scenarios[g].conquered) //display as striped

+ 39 - 12
server/CGameHandler.cpp

@@ -1469,33 +1469,39 @@ void CGameHandler::run(bool resume)
 		return;
 	}
 
-	while (!end2)
+	auto playerTurnOrder = generatePlayerTurnOrder();
+
+	while(!end2)
 	{
-		if(!resume)
-			newTurn();
+		if(!resume) newTurn();
 
-		std::map<PlayerColor,PlayerState>::iterator i;
-		if(!resume)
-			i = gs->players.begin();
+		std::list<PlayerColor>::iterator it;
+		if(resume)
+		{
+			it = std::find(playerTurnOrder.begin(), playerTurnOrder.end(), gs->currentPlayer);
+		}
 		else
-			i = gs->players.find(gs->currentPlayer);
+		{
+			it = playerTurnOrder.begin();
+		}
 
 		resume = false;
-		for(; i != gs->players.end(); i++)
+		for(; it != playerTurnOrder.end(); it++)
 		{
-			if(i->second.status == EPlayerStatus::INGAME)
+			auto playerColor = *it;
+			if(gs->players[playerColor].status == EPlayerStatus::INGAME)
 			{
-				states.setFlag(i->first,&PlayerStatus::makingTurn,true);
+				states.setFlag(playerColor, &PlayerStatus::makingTurn, true);
 
 				YourTurn yt;
-				yt.player = i->first;
+				yt.player = playerColor;
 				applyAndSend(&yt);
 
 				checkVictoryLossConditionsForAll();
 
 				//wait till turn is done
 				boost::unique_lock<boost::mutex> lock(states.mx);
-				while(states.players.at(i->first).makingTurn && !end2)
+				while(states.players.at(playerColor).makingTurn && !end2)
 				{
 					static time_duration p = milliseconds(200);
 					states.cv.timed_wait(lock,p);
@@ -1507,6 +1513,27 @@ void CGameHandler::run(bool resume)
 		boost::this_thread::sleep(boost::posix_time::milliseconds(5)); //give time client to close socket
 }
 
+std::list<PlayerColor> CGameHandler::generatePlayerTurnOrder() const
+{
+	// Generate player turn order
+	std::list<PlayerColor> playerTurnOrder;
+
+	bool playCampaign = gs->scenarioOps->campState != nullptr;
+	for(const auto & player : gs->players) // add human players for campaign only first OR all players for normal game
+	{
+		if(player.second.human || !playCampaign) playerTurnOrder.push_back(player.first);
+	}
+	if(playCampaign)
+	{
+		for(const auto & player : gs->players) // then add non-human players for campaign
+		{
+			if(!player.second.human) playerTurnOrder.push_back(player.first);
+		}
+	}
+
+	return std::move(playerTurnOrder);
+}
+
 void CGameHandler::setupBattle( int3 tile, const CArmedInstance *armies[2], const CGHeroInstance *heroes[2], bool creatureBank, const CGTownInstance *town )
 {
 	battleResult.set(nullptr);

+ 1 - 0
server/CGameHandler.h

@@ -289,6 +289,7 @@ public:
 	friend class CScriptCallback;
 
 private:
+	std::list<PlayerColor> generatePlayerTurnOrder() const;
 	void makeStackDoNothing(const CStack * next);
 	void getVictoryLossMessage(PlayerColor player, EVictoryLossCheckResult victoryLossCheckResult, InfoWindow & out) const;