Răsfoiți Sursa

- Hopefully fixed possibleActions for every case
- better algorithm for looting artifacts, yet buggy

DjWarmonger 13 ani în urmă
părinte
comite
5d311fb3ed
2 a modificat fișierele cu 49 adăugiri și 49 ștergeri
  1. 2 0
      client/BattleInterface/CBattleInterface.cpp
  2. 47 49
      server/CGameHandler.cpp

+ 2 - 0
client/BattleInterface/CBattleInterface.cpp

@@ -1387,6 +1387,8 @@ void CBattleInterface::newRound(int number)
 
 void CBattleInterface::giveCommand(ui8 action, BattleHex tile, ui32 stackID, si32 additional, si32 selected)
 {
+	possibleActions.clear(); //no checks allowed before action is resolved
+
 	const CStack *stack = curInt->cb->battleGetStackByID(stackID);
 	if(!stack && action != BattleAction::HERO_SPELL && action != BattleAction::RETREAT && action != BattleAction::SURRENDER)
 	{

+ 47 - 49
server/CGameHandler.cpp

@@ -455,55 +455,53 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance *hero1, const CGHer
 	}
 	//TODO: check if hero surrended / fled
 	//TODO: display loot in window
-	//if (result < BattleResult::SURRENDER && winnerHero)
-	//{
-	//	if (loserHero)
-	//	{
-	//		BOOST_FOREACH (auto art, loserHero->artifactsWorn)
-	//		{
-	//			if (art.second.artifact)
-	//			{
-	//				MoveArtifact ma; //TODO: put into a function?
-	//				ma.src = ArtifactLocation (loserHero, art.first);
-	//				ma.dst = ArtifactLocation (winnerHero, art.second.artifact->firstAvailableSlot(winnerHero));
-	//				sendAndApply(&ma);
-	//			}
-	//		}
-	//		BOOST_FOREACH (auto art, loserHero->artifactsInBackpack)
-	//		{
-	//			if (art.artifact)
-	//			{
-	//				MoveArtifact ma;
-	//				ma.src = ArtifactLocation (loserHero, loserHero->getArtPos (art.artifact->artType->id, false)); //I smell trouble?
-	//				ma.dst = ArtifactLocation (winnerHero, art.artifact->firstAvailableSlot(winnerHero));
-	//				sendAndApply(&ma);
-	//			}
-	//		}
-	//		if (loserHero->commander) //TODO: what if commanders belong to no hero?
-	//		{
-	//			BOOST_FOREACH (auto art, loserHero->commander->artifactsWorn)
-	//			{
-	//				if (art.second.artifact)
-	//				{
-	//					MoveArtifact ma; //FIXME: boost::variant vs pointer casting is bad solution
-	//					ma.src = ArtifactLocation (ConstTransitivePtr <CStackInstance> (loserHero->commander), art.first);
-	//					ma.dst = ArtifactLocation (winnerHero, art.second.artifact->firstAvailableSlot(winnerHero));
-	//					sendAndApply(&ma);
-	//				}
-	//			}
-	//		}
-	//	}
-	//	BOOST_FOREACH (auto armySlot, gs->curB->belligerents[loser]->stacks)
-	//	{
-	//		MoveArtifact ma;
-	//		ma.src = ArtifactLocation (armySlot.second, (ArtifactPosition::CREATURE_SLOT));
-	//		{
-	//			if (CArtifactInstance * art = ma.src.getArt())
-	//				ma.dst = ArtifactLocation (winnerHero, art->firstAvailableSlot(winnerHero));
-	//			sendAndApply(&ma);
-	//		}
-	//	}
-	//}
+	if (result < BattleResult::SURRENDER && winnerHero)
+	{
+		if (loserHero)
+		{
+			auto artifactsWorn = loserHero->artifactsWorn;
+			BOOST_FOREACH (auto artSlot, artifactsWorn)
+			{
+				MoveArtifact ma; //TODO: put into a function?
+				ma.src = ArtifactLocation (loserHero, artSlot.first);
+				const CArtifactInstance * art =  ma.src.getArt();
+				if (art && !art->artType->isBig()) // don't move war machines or locked arts (spellbook)
+				{
+					ma.dst = ArtifactLocation (winnerHero, art->firstAvailableSlot(winnerHero));
+					sendAndApply(&ma);
+				}
+			}
+			while (!loserHero->artifactsInBackpack.empty())
+			{
+				//we assume that no big artifatcs cna be found
+				MoveArtifact ma;
+				ma.src = ArtifactLocation (loserHero, GameConstants::BACKPACK_START); //backpack automatically shifts arts to beginning
+				const CArtifactInstance * art =  ma.src.getArt();
+				ma.dst = ArtifactLocation (winnerHero, art->firstAvailableSlot(winnerHero));
+				sendAndApply(&ma);
+			}
+			//if (loserHero->commander) //TODO: what if commanders belong to no hero?
+			//{
+			//	BOOST_FOREACH (auto art, loserHero->commander->artifactsWorn)
+			//	{
+			//		MoveArtifact ma; //FIXME: boost::variant vs pointer casting is bad solution
+			//		ma.src = ArtifactLocation (loserHero->commander.get(), art.first);
+			//		ma.dst = ArtifactLocation (winnerHero, art.second.artifact->firstAvailableSlot(winnerHero));
+			//		sendAndApply(&ma);
+			//	}
+			//}
+		}
+		//BOOST_FOREACH (auto armySlot, gs->curB->belligerents[loser]->stacks)
+		//{
+		//	MoveArtifact ma;
+		//	ma.src = ArtifactLocation (armySlot.second, (ArtifactPosition::CREATURE_SLOT));
+		//	{
+		//		if (CArtifactInstance * art = ma.src.getArt())
+		//			ma.dst = ArtifactLocation (winnerHero, art->firstAvailableSlot(winnerHero));
+		//		sendAndApply(&ma);
+		//	}
+		//}
+	}
 
 	if (necroSlot != -1) 
 	{