浏览代码

Army exchange implementation

Andrii Danylchenko 4 年之前
父节点
当前提交
8fa0b30985
共有 2 个文件被更改,包括 29 次插入22 次删除
  1. 11 13
      client/widgets/Images.cpp
  2. 18 9
      client/windows/GUIClasses.cpp

+ 11 - 13
client/widgets/Images.cpp

@@ -288,10 +288,18 @@ void CAnimImage::showAll(SDL_Surface * to)
 	if(!visible)
 		return;
 
-	if(flags & CShowableAnim::BASE && frame != 0)
-		if(auto img = anim->getImage(0, group))
+	std::vector<size_t> frames = {frame};
+
+	if((flags & CShowableAnim::BASE) && frame != 0)
+	{
+		frames.insert(frames.begin(), 0);
+	}
+
+	for(auto targetFrame : frames)
+	{
+		if(auto img = anim->getImage(targetFrame, group))
 		{
-			if (isScaled())
+			if(isScaled())
 			{
 				auto scaled = img->scaleFast(float(scaledSize.x) / img->width());
 				scaled->draw(to, pos.x, pos.y);
@@ -299,16 +307,6 @@ void CAnimImage::showAll(SDL_Surface * to)
 			else
 				img->draw(to, pos.x, pos.y);
 		}
-
-	if(auto img = anim->getImage(frame, group))
-	{
-		if (isScaled())
-		{
-			auto scaled = img->scaleFast(float(scaledSize.x) / img->width());
-			scaled->draw(to, pos.x, pos.y);
-		}
-		else
-			img->draw(to, pos.x, pos.y);
 	}
 }
 

+ 18 - 9
client/windows/GUIClasses.cpp

@@ -812,25 +812,29 @@ std::function<void()> CExchangeController::onMoveArmyToRight()
 
 std::function<void()> CExchangeController::onSwapArmy()
 {
-	return [&]() { 
-		auto cb = LOCPLINT->cb;
+	return [&]()
+	{ 
+		std::shared_ptr<CCallback> cb = LOCPLINT->cb;
+		const TSlots & leftSlots = left->Slots();
+		const TSlots & rightSlots = right->Slots();
 
-		for(SlotID i = SlotID(0); i.validSlot(); i.advance(1))
+		for(auto i = leftSlots.begin(), j = rightSlots.begin(); i != leftSlots.end() && j != rightSlots.end(); i++, j++)
 		{
-			if(left->hasStackAtSlot(i) || right->hasStackAtSlot(i))
-				cb->swapCreatures(left, right, SlotID(i), SlotID(i));
+			cb->swapCreatures(left, right, i->first, j->first);
 		}
 	};
 }
 
 void CExchangeController::hdModQuickExchangeArmy(bool leftToRight)
 {
-	auto source = leftToRight ? left : right;
-	auto target = leftToRight ? right : left;
-	auto cb = LOCPLINT->cb;
+	const CGHeroInstance * source = leftToRight ? left : right;
+	const CGHeroInstance * target = leftToRight ? right : left;
+	std::shared_ptr<CCallback> cb = LOCPLINT->cb;
 
 	boost::thread([=]
 	{
+		boost::shared_lock<boost::shared_mutex> gsLock(CGameState::mutex);
+
 		auto slots = source->Slots();
 		std::vector<std::pair<SlotID, CStackInstance *>> stacks(slots.begin(), slots.end());
 
@@ -839,7 +843,11 @@ void CExchangeController::hdModQuickExchangeArmy(bool leftToRight)
 			return a.second->type->level > b.second->type->level;
 		});
 
+		auto originalWaitTillRealize = cb->waitTillRealize;
+		auto originalUnlockGsWhenWating = cb->unlockGsWhenWaiting;
+
 		cb->waitTillRealize = true;
+		cb->unlockGsWhenWaiting = true;
 
 		for(auto pair : stacks)
 		{
@@ -866,7 +874,8 @@ void CExchangeController::hdModQuickExchangeArmy(bool leftToRight)
 			}
 		}
 
-		cb->waitTillRealize = false;
+		cb->waitTillRealize = originalWaitTillRealize;
+		cb->unlockGsWhenWaiting = originalUnlockGsWhenWating;
 	});
 }