Sfoglia il codice sorgente

More work on static variable desyncs

Arseniy Shestakov 9 anni fa
parent
commit
668cd83ee5
2 ha cambiato i file con 25 aggiunte e 3 eliminazioni
  1. 6 2
      lib/CGameInfoCallback.cpp
  2. 19 1
      lib/CGameState.cpp

+ 6 - 2
lib/CGameInfoCallback.cpp

@@ -735,8 +735,12 @@ int3 CPlayerSpecificInfoCallback::getGrailPos( double *outKnownRatio )
 	}
 	else
 	{
-		*outKnownRatio = static_cast<double>(CGObelisk::visited[gs->getPlayerTeam(*player)->id])
-			/ CGObelisk::obeliskCount;
+		TeamID t = gs->getPlayerTeam(*player)->id;
+		double visited = 0.0;
+		if(CGObelisk::visited.count(t))
+			visited = static_cast<double>(CGObelisk::visited[t]);
+
+		*outKnownRatio = visited / CGObelisk::obeliskCount;
 	}
 	return gs->map->grailPos;
 }

+ 19 - 1
lib/CGameState.cpp

@@ -787,6 +787,16 @@ void CGameState::init(StartInfo * si)
 	initVisitingAndGarrisonedHeroes();
 	initFogOfWar();
 
+	// Explicitly initialize static variables
+	for(auto & elem : players)
+	{
+		CGKeys::playerKeyMap[elem.first] = {};
+	}
+	for(auto & elem : teams)
+	{
+		CGObelisk::visited[elem.first] = 0;
+	}
+
 	logGlobal->debug("\tChecking objectives");
 	map->checkForObjectives(); //needs to be run when all objects are properly placed
 
@@ -2637,7 +2647,15 @@ void CGameState::obtainPlayersStats(SThievesGuildInfo & tgi, int level)
 	}
 	if(level >= 3) //obelisks found
 	{
-		FILL_FIELD(obelisks, CGObelisk::visited[gs->getPlayerTeam(g->second.color)->id])
+		auto getObeliskVisited = [](TeamID t)
+		{
+			if(CGObelisk::visited.count(t))
+				return CGObelisk::visited[t];
+			else
+				return ui8(0);
+		};
+
+		FILL_FIELD(obelisks, getObeliskVisited(gs->getPlayerTeam(g->second.color)->id))
 	}
 	if(level >= 4) //artifacts
 	{