Kaynağa Gözat

Not very nice fix for campaigns.

Michał W. Urbańczyk 15 yıl önce
ebeveyn
işleme
0e12c1419e
2 değiştirilmiş dosya ile 60 ekleme ve 48 silme
  1. 59 47
      client/CPreGame.cpp
  2. 1 1
      global.h

+ 59 - 47
client/CPreGame.cpp

@@ -70,7 +70,7 @@ extern SystemOptions GDefaultOptions;
 CGPreGame * CGP;
 ISelectionScreenInfo *SEL;
 
-static int playerColor; //if more than one player - applies to the first -------- BROKEN BROKEN BROKEN
+static int playerColor; //if more than one player - applies to the first
 
 static std::string selectedName; //set when game is started/loaded
 
@@ -127,6 +127,59 @@ static void swapPlayers(PlayerSettings &a, PlayerSettings &b)
 		playerColor = b.color;
 }
 
+void setPlayer(PlayerSettings &pset, unsigned player, const std::map<ui32, std::string> &playerNames)
+{
+	if(vstd::contains(playerNames, player))
+		pset.name = playerNames.find(player)->second;
+	else
+		pset.name = CGI->generaltexth->allTexts[468];//Computer
+
+	pset.human = player;
+	if(player == playerNames.begin()->first)
+		playerColor = pset.color;
+}
+
+void updateStartInfo(std::string filename, StartInfo & sInfo, const CMapHeader * mapHeader, const std::map<ui32, std::string> &playerNames)
+{
+	sInfo.playerInfos.clear();
+	if(!filename.size()) 
+		return;
+
+	/*sInfo.playerInfos.resize(to->playerAmnt);*/
+	sInfo.mapname = filename;
+	playerColor = -1;
+
+	std::map<ui32, std::string>::const_iterator namesIt = playerNames.begin();
+
+	for (int i = 0; i < PLAYER_LIMIT; i++)
+	{
+		const PlayerInfo &pinfo = mapHeader->players[i];
+
+		//neither computer nor human can play - no player
+		if (!(pinfo.canComputerPlay || pinfo.canComputerPlay))
+			continue;
+
+		PlayerSettings &pset = sInfo.playerInfos[i];
+		pset.color = i;
+		if(pinfo.canHumanPlay && namesIt != playerNames.end())
+			setPlayer(pset, namesIt++->first, playerNames);
+		else
+			setPlayer(pset, 0, playerNames);
+
+		pset.castle = pinfo.defaultCastle();
+		pset.hero = pinfo.defaultHero(mapHeader->version==CMapHeader::RoE);
+
+
+		if(pinfo.mainHeroName.length())
+		{
+			pset.heroName = pinfo.mainHeroName;
+			if((pset.heroPortrait = pinfo.mainHeroPortrait) == 255)
+				pset.heroPortrait = pinfo.p9;
+		}
+		pset.handicap = 0;
+	}
+}
+
 template <typename T> class CApplyOnPG;
 
 class CBaseForPGApply
@@ -2696,7 +2749,9 @@ void CBonusSelection::selectMap( int whichOne )
 	ourHeader = new CMapHeader();
 	ourHeader->initFromMemory((const unsigned char*)ourCampaign->camp->mapPieces.find(whichOne)->second.c_str(), i);
 	
-	SEL->updateStartInfo(ourCampaign->camp->header.filename, sInfo, ourHeader);
+	std::map<ui32, std::string> names;
+	names[1] = GDefaultOptions.playerName;
+	updateStartInfo(ourCampaign->camp->header.filename, sInfo, ourHeader, names);
 	sInfo.turnTime = 0;
 	sInfo.whichMapInCampaign = whichOne;
 	sInfo.difficulty = ourCampaign->camp->scenarios[whichOne].difficulty;
@@ -3123,55 +3178,12 @@ ISelectionScreenInfo::~ISelectionScreenInfo()
 
 void ISelectionScreenInfo::updateStartInfo(std::string filename, StartInfo & sInfo, const CMapHeader * mapHeader)
 {
-	sInfo.playerInfos.clear();
-	if(!filename.size()) 
-		return;
-
-	/*sInfo.playerInfos.resize(to->playerAmnt);*/
-	sInfo.mapname = filename;
-	playerColor = -1;
-
-	std::map<ui32, std::string>::const_iterator namesIt = playerNames.begin();
-
-	for (int i = 0; i < PLAYER_LIMIT; i++)
-	{
-		const PlayerInfo &pinfo = mapHeader->players[i];
-
-		//neither computer nor human can play - no player
-		if (!(pinfo.canComputerPlay || pinfo.canComputerPlay))
-			continue;
-
-		PlayerSettings &pset = sInfo.playerInfos[i];
-		pset.color = i;
-		if(pinfo.canHumanPlay && namesIt != playerNames.end())
-			setPlayer(pset, namesIt++->first);
-		else
-			setPlayer(pset, 0);
-
-		pset.castle = pinfo.defaultCastle();
-		pset.hero = pinfo.defaultHero(mapHeader->version==CMapHeader::RoE);
-
-
-		if(pinfo.mainHeroName.length())
-		{
-			pset.heroName = pinfo.mainHeroName;
-			if((pset.heroPortrait = pinfo.mainHeroPortrait) == 255)
-				pset.heroPortrait = pinfo.p9;
-		}
-		pset.handicap = 0;
-	}
+	::updateStartInfo(filename, sInfo, mapHeader, playerNames);
 }
 
 void ISelectionScreenInfo::setPlayer(PlayerSettings &pset, unsigned player)
 {
-	if(vstd::contains(playerNames, player))
-		pset.name = playerNames[player];
-	else
-		pset.name = CGI->generaltexth->allTexts[468];//Computer
-
-	pset.human = player;
-	if(player == playerNames.begin()->first)
-		playerColor = pset.color;
+	::setPlayer(pset, player, playerNames);
 }
 
 int ISelectionScreenInfo::getIdOfFirstUnallocatedPlayer()

+ 1 - 1
global.h

@@ -25,7 +25,7 @@ typedef ui16 spelltype;
 #define THC
 #endif
 
-#define NAME_VER ("VCMI 0.82b")
+#define NAME_VER ("VCMI 0.82c")
 extern std::string NAME; //full name
 extern std::string NAME_AFFIX; //client / server
 #define CONSOLE_LOGGING_LEVEL 5