瀏覽代碼

PlayerState::daysWithoutCastle: change in netpacks only. Fix issue 2462

Moving code from CGameHandler to NetPacksLib without changes.
Arseniy Shestakov 9 年之前
父節點
當前提交
abad3cfb17
共有 2 個文件被更改,包括 27 次插入22 次删除
  1. 27 1
      lib/NetPacksLib.cpp
  2. 0 21
      server/CGameHandler.cpp

+ 27 - 1
lib/NetPacksLib.cpp

@@ -1093,6 +1093,25 @@ DLL_LINKAGE void NewTurn::applyGs( CGameState *gs )
 
 	if(gs->getDate(Date::DAY_OF_WEEK) == 1)
 		gs->updateRumor();
+
+	//count days without town for all players, regardless of their turn order
+	for (auto &p : gs->players)
+	{
+		PlayerState & playerState = p.second;
+		if (playerState.status == EPlayerStatus::INGAME)
+		{
+			if (playerState.towns.empty())
+			{
+				if (playerState.daysWithoutCastle)
+					++(*playerState.daysWithoutCastle);
+				else playerState.daysWithoutCastle = 0;
+			}
+			else
+			{
+				playerState.daysWithoutCastle = boost::none;
+			}
+		}
+	}
 }
 
 DLL_LINKAGE void SetObjectProperty::applyGs( CGameState *gs )
@@ -1113,7 +1132,14 @@ DLL_LINKAGE void SetObjectProperty::applyGs( CGameState *gs )
 			if(t->tempOwner < PlayerColor::PLAYER_LIMIT)
 				gs->getPlayer(t->tempOwner)->towns -= t;
 			if(val < PlayerColor::PLAYER_LIMIT_I)
-				gs->getPlayer(PlayerColor(val))->towns.push_back(t);
+			{
+				PlayerState * p = gs->getPlayer(PlayerColor(val));
+				p->towns.push_back(t);
+
+				//reset counter before NewTurn to avoid no town message if game loaded at turn when one already captured
+				if(p->daysWithoutCastle)
+					p->daysWithoutCastle = boost::none;
+			}
 		}
 
 		CBonusSystemNode *nodeToMove = cai->whatShouldBeAttached();

+ 0 - 21
server/CGameHandler.cpp

@@ -1716,25 +1716,6 @@ void CGameHandler::newTurn()
 			elem->newTurn();
 	}
 
-	//count days without town for all players, regardless of their turn order
-	for (auto &p : gs->players)
-	{
-		PlayerState & playerState = p.second;
-		if (playerState.status == EPlayerStatus::INGAME)
-		{
-			if (playerState.towns.empty())
-			{
-				if (playerState.daysWithoutCastle)
-					++(*playerState.daysWithoutCastle);
-				else playerState.daysWithoutCastle = 0;
-			}
-			else
-			{
-				playerState.daysWithoutCastle = boost::none;
-			}
-		}
-	}
-
 	synchronizeArtifactHandlerLists(); //new day events may have changed them. TODO better of managing that
 }
 void CGameHandler::run(bool resume)
@@ -2183,8 +2164,6 @@ void CGameHandler::setOwner(const CGObjectInstance * obj, PlayerColor owner)
 			const CGTownInstance * town = dynamic_cast<const CGTownInstance *>(obj);
 			if (town->hasBuilt(BuildingID::PORTAL_OF_SUMMON, ETownType::DUNGEON))
 				setPortalDwelling(town, true, false);
-
-			gs->getPlayer(owner)->daysWithoutCastle = boost::none; // reset counter
 		}
 
 		if (oldOwner < PlayerColor::PLAYER_LIMIT) //old owner is real player