浏览代码

Timers fixes

nordsoft 2 年之前
父节点
当前提交
cc3ca9a41e

+ 50 - 47
client/adventureMap/TurnTimerWidget.cpp

@@ -97,60 +97,63 @@ void TurnTimerWidget::setTime(PlayerColor player, int time)
 	}
 }
 
+void TurnTimerWidget::updateTimer(PlayerColor player, uint32_t msPassed)
+{
+	const auto & time = LOCPLINT->cb->getPlayerTurnTime(player);
+	if(time.isActive)
+		cachedTurnTime -= msPassed;
+	
+	if(cachedTurnTime < 0)
+		cachedTurnTime = 0; //do not go below zero
+	
+	if(lastPlayer != player)
+	{
+		lastPlayer = player;
+		lastTurnTime = 0;
+	}
+	
+	auto timeCheckAndUpdate = [&](int time)
+	{
+		if(time / 1000 != lastTurnTime / 1000)
+		{
+			//do not update timer on this tick
+			lastTurnTime = time;
+			cachedTurnTime = time;
+		}
+		else
+			setTime(player, cachedTurnTime);
+	};
+	
+	auto * playerInfo = LOCPLINT->cb->getPlayer(player);
+	if(player.isValidPlayer() || (playerInfo && playerInfo->isHuman()))
+	{
+		if(time.isBattle)
+			timeCheckAndUpdate(time.creatureTimer);
+		else
+			timeCheckAndUpdate(time.turnTimer);
+	}
+	else
+		timeCheckAndUpdate(0);
+}
+
 void TurnTimerWidget::tick(uint32_t msPassed)
 {
 	if(!LOCPLINT || !LOCPLINT->cb)
 		return;
 
-	for(PlayerColor p(0); p < PlayerColor::PLAYER_LIMIT; ++p)
+	if(LOCPLINT->battleInt)
 	{
-		auto player = p;
-		if(LOCPLINT->battleInt)
-		{
-			if(auto * stack = LOCPLINT->battleInt->stacksController->getActiveStack())
-				player = stack->getOwner();
-			else
-				continue;
-			if(p != player)
-				continue;
-		}
-		else if(!LOCPLINT->cb->isPlayerMakingTurn(player))
-			continue;
-
-		auto time = LOCPLINT->cb->getPlayerTurnTime(player);
-		if(time.isActive)
-			cachedTurnTime -= msPassed;
-		
-		if(cachedTurnTime < 0)
-			cachedTurnTime = 0; //do not go below zero
-		
-		if(lastPlayer != player)
-		{
-			lastPlayer = player;
-			lastTurnTime = 0;
-		}
-		
-		auto timeCheckAndUpdate = [&](int time)
-		{
-			if(time / 1000 != lastTurnTime / 1000)
-			{
-				//do not update timer on this tick
-				lastTurnTime = time;
-				cachedTurnTime = time;
-			}
-			else
-				setTime(player, cachedTurnTime);
-		};
-		
-		auto * playerInfo = LOCPLINT->cb->getPlayer(player);
-		if(player.isValidPlayer() || (playerInfo && playerInfo->isHuman()))
+		if(auto * stack = LOCPLINT->battleInt->stacksController->getActiveStack())
+			updateTimer(stack->getOwner(), msPassed);
+		else
+			updateTimer(PlayerColor::NEUTRAL, msPassed);
+	}
+	else
+	{
+		for(PlayerColor p(0); p < PlayerColor::PLAYER_LIMIT; ++p)
 		{
-			if(time.isBattle)
-				timeCheckAndUpdate(time.creatureTimer);
-			else
-				timeCheckAndUpdate(time.turnTimer);
+			if(LOCPLINT->cb->isPlayerMakingTurn(p))
+				updateTimer(p, msPassed);
 		}
-		else
-			timeCheckAndUpdate(0);
 	}
 }

+ 2 - 0
client/adventureMap/TurnTimerWidget.h

@@ -46,6 +46,8 @@ private:
 	std::set<int> notifications;
 	
 	std::shared_ptr<DrawRect> buildDrawRect(const JsonNode & config) const;
+	
+	void updateTimer(PlayerColor player, uint32_t msPassed);
 
 public:
 

+ 1 - 1
lib/TurnTimerInfo.h

@@ -19,7 +19,7 @@ struct DLL_LINKAGE TurnTimerInfo
 	int battleTimer = 0; //in ms, counts down during battles when creature timer runs out
 	int creatureTimer = 0; //in ms, counts down when player is choosing action in battle
 	
-	bool isActive = true; //should be paused if set to false
+	bool isActive = false; //is being counting down
 	bool isBattle = false; //indicator for current timer mode
 	
 	bool isEnabled() const;

+ 9 - 5
server/TurnTimerHandler.cpp

@@ -187,14 +187,18 @@ void TurnTimerHandler::onBattleEnd()
 	
 	for(auto i : {attacker, defender})
 	{
-		if(i.isValidPlayer() && !pvpBattle)
+		if(i.isValidPlayer())
 		{
 			auto & timer = timers[i];
 			timer.isBattle = false;
-			if(si->turnTimerInfo.baseTimer && timer.baseTimer == 0)
-				timer.baseTimer = timer.creatureTimer;
-			else if(si->turnTimerInfo.turnTimer && timer.turnTimer == 0)
-				timer.turnTimer = timer.creatureTimer;
+			
+			if(!pvpBattle)
+			{
+				if(si->turnTimerInfo.baseTimer && timer.baseTimer == 0)
+					timer.baseTimer = timer.creatureTimer;
+				else if(si->turnTimerInfo.turnTimer && timer.turnTimer == 0)
+					timer.turnTimer = timer.creatureTimer;
+			}
 
 			sendTimerUpdate(i);
 		}

+ 1 - 2
server/battles/BattleResultProcessor.cpp

@@ -263,9 +263,8 @@ void BattleResultProcessor::endBattle(int3 tile, const CGHeroInstance * heroAtta
 			otherBattleQuery->result = battleQuery->result;
 	}
 
-	gameHandler->sendAndApply(battleResult.get()); //after this point casualties objects are destroyed
-	
 	gameHandler->turnTimerHandler.onBattleEnd();
+	gameHandler->sendAndApply(battleResult.get()); //after this point casualties objects are destroyed
 
 	if (battleResult->queryID == QueryID::NONE)
 		endBattleConfirm(gameHandler->gameState()->curB);