Browse Source

Revert some changes, update WIDE_BREATH

Dydzio 8 years ago
parent
commit
5c17e172b6
2 changed files with 66 additions and 186 deletions
  1. 65 185
      lib/battle/CBattleInfoCallback.cpp
  2. 1 1
      lib/battle/CBattleInfoCallback.h

+ 65 - 185
lib/battle/CBattleInfoCallback.cpp

@@ -1120,7 +1120,7 @@ ReachabilityInfo CBattleInfoCallback::getFlyingReachability(const ReachabilityIn
 	return ret;
 }
 
-AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos, bool rangedAttack) const
+AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos) const
 {
 	//does not return hex attacked directly
 	//TODO: apply rotation to two-hex attackers
@@ -1129,7 +1129,7 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack
 	AttackableTiles at;
 	RETURN_IF_NOT_BATTLE(at);
 
-	if(rangedAttack)
+	/*if(rangedAttack)
 	{
 		if(attacker->hasBonusOfType(Bonus::SHOOTS_ALL_ADJACENT) && !vstd::contains(attackerPos.neighbouringTiles(), destinationTile))
 		{
@@ -1137,202 +1137,82 @@ AttackableTiles CBattleInfoCallback::getPotentiallyAttackableHexes (const CStack
 			targetHexes.push_back(destinationTile);
 			boost::copy(targetHexes, vstd::set_inserter(at.hostileCreaturePositions));
 		}
-	}
+	}*/
 
-	else
-	{
-		const int WN = GameConstants::BFIELD_WIDTH;
-		BattleHex hex = (attackerPos != BattleHex::INVALID) ? attackerPos.hex : attacker->position.hex; //real or hypothetical (cursor) position
+	const int WN = GameConstants::BFIELD_WIDTH;
+	BattleHex hex = (attackerPos != BattleHex::INVALID) ? attackerPos.hex : attacker->position.hex; //real or hypothetical (cursor) position
 
-		//FIXME: dragons or cerbers can rotate before attack, making their base hex different (#1124)
-		bool reverse = isToReverse(hex, destinationTile, isAttacker, attacker->doubleWide(), isAttacker);
-		if(reverse && attacker->doubleWide())
-		{
-			hex = attacker->occupiedHex(hex); //the other hex stack stands on
-		}
-		if(attacker->hasBonusOfType(Bonus::ATTACKS_ALL_ADJACENT))
-		{
-			boost::copy(attacker->getSurroundingHexes(attackerPos), vstd::set_inserter(at.hostileCreaturePositions));
-		}
-		if(attacker->hasBonusOfType(Bonus::THREE_HEADED_ATTACK))
+	//FIXME: dragons or cerbers can rotate before attack, making their base hex different (#1124)
+	bool reverse = isToReverse(hex, destinationTile, isAttacker, attacker->doubleWide(), isAttacker);
+	if(reverse && attacker->doubleWide())
+	{
+		hex = attacker->occupiedHex(hex); //the other hex stack stands on
+	}
+	if(attacker->hasBonusOfType(Bonus::ATTACKS_ALL_ADJACENT))
+	{
+		boost::copy(attacker->getSurroundingHexes(attackerPos), vstd::set_inserter(at.hostileCreaturePositions));
+	}
+	if(attacker->hasBonusOfType(Bonus::THREE_HEADED_ATTACK))
+	{
+		std::vector<BattleHex> hexes = attacker->getSurroundingHexes(attackerPos);
+		for(BattleHex tile : hexes)
 		{
-			std::vector<BattleHex> hexes = attacker->getSurroundingHexes(attackerPos);
-			for(BattleHex tile : hexes)
+			if((BattleHex::mutualPosition(tile, destinationTile) > -1 && BattleHex::mutualPosition(tile, hex) > -1)) //adjacent both to attacker's head and attacked tile
 			{
-				if((BattleHex::mutualPosition(tile, destinationTile) > -1 && BattleHex::mutualPosition(tile, hex) > -1)) //adjacent both to attacker's head and attacked tile
+				const CStack * st = battleGetStackByPos(tile, true);
+				if(st && st->owner != attacker->owner) //only hostile stacks - does it work well with Berserk?
 				{
-					const CStack * st = battleGetStackByPos(tile, true);
-					if(st && st->owner != attacker->owner) //only hostile stacks - does it work well with Berserk?
-					{
-						at.hostileCreaturePositions.insert(tile);
-					}
+					at.hostileCreaturePositions.insert(tile);
 				}
 			}
 		}
-		if(attacker->hasBonusOfType(Bonus::WIDE_BREATH))
-		{
-			std::vector<BattleHex> hexes;
-			// attack stand
-			if(hex == destinationTile.cloneInDirection(BattleHex::EDir::LEFT, false)) {
-				if(destinationTile.getY() % 2 == 0)
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN) - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
-				}
-				else {
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN) - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
-				}
-
-			}
-			if(hex == destinationTile.cloneInDirection(BattleHex::EDir::RIGHT, false)) {
-				if(destinationTile.getY() % 2 == 0)
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN) + 1, hexes);
-				}
-				else
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN), hexes);
-					BattleHex::checkAndPush(destinationTile + (2 * WN) + 1, hexes);
-				}
-			}
-			// attack down
-			if(hex == destinationTile.cloneInDirection(BattleHex::EDir::TOP_LEFT, false)) {
-				if(destinationTile.getY() % 2 == 1)
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile - 1, hexes);
-					BattleHex::checkAndPush(destinationTile - 2, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 2, hexes);
-				}
-				else {
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile - 1, hexes);
-					BattleHex::checkAndPush(destinationTile - 2, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
-				}
-			}
-			if(hex == destinationTile.cloneInDirection(BattleHex::EDir::TOP_RIGHT, false)) {
-
-				if(destinationTile.getY() % 2 == 1)
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + 2, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
-				}
-				else
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + 2, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 2, hexes);
-				}
-
-			}
-			// attack up
-			if(hex == destinationTile.cloneInDirection(BattleHex::EDir::BOTTOM_LEFT, false)) {
-				if(destinationTile.getY() % 2 == 1)
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
-					BattleHex::checkAndPush(destinationTile - WN, hexes);
-					BattleHex::checkAndPush(destinationTile - WN - 1, hexes);
-				}
-				else {
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN + 2, hexes);
-					BattleHex::checkAndPush(destinationTile - WN, hexes);
-					BattleHex::checkAndPush(destinationTile - WN + 1, hexes);
-				}
-			}
-			if(hex == destinationTile.cloneInDirection(BattleHex::EDir::BOTTOM_RIGHT, false)) {
-
-				if(destinationTile.getY() % 2 == 1)
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 2, hexes);
-					BattleHex::checkAndPush(destinationTile - WN, hexes);
-					BattleHex::checkAndPush(destinationTile - WN - 1, hexes);
-				}
-				else
-				{
-					BattleHex::checkAndPush(destinationTile, hexes);
-					BattleHex::checkAndPush(destinationTile - 1, hexes);
-					BattleHex::checkAndPush(destinationTile + WN, hexes);
-					BattleHex::checkAndPush(destinationTile + WN - 1, hexes);
-					BattleHex::checkAndPush(destinationTile - WN, hexes);
-					BattleHex::checkAndPush(destinationTile - WN + 1, hexes);
-				}
+	}
 
+	if(attacker->hasBonusOfType(Bonus::WIDE_BREATH))
+	{
+		std::vector<BattleHex> hexes = destinationTile.neighbouringTiles();
+		for(int i = 0; i<hexes.size(); i++)
+		{
+			if(hexes.at(i) == hex) {
+				hexes.erase(hexes.begin() + i);
+				i = 0;
 			}
-
-			for(BattleHex tile : hexes)
-			{
-				//friendly stacks can also be damaged by Dragon Breath
-				if(battleGetStackByPos(tile, true))
+		}
+		for(BattleHex tile : hexes)
+		{
+			//friendly stacks can also be damaged by Dragon Breath
+			if(battleGetStackByPos(tile, true))
+				if(battleGetStackByPos(tile, true) != attacker)
 					at.friendlyCreaturePositions.insert(tile);
-			}
 		}
+	}
 
-		else if(attacker->hasBonusOfType(Bonus::TWO_HEX_ATTACK_BREATH) && BattleHex::mutualPosition(destinationTile.hex, hex) > -1) //only adjacent hexes are subject of dragon breath calculation
+	else if(attacker->hasBonusOfType(Bonus::TWO_HEX_ATTACK_BREATH) && BattleHex::mutualPosition(destinationTile.hex, hex) > -1) //only adjacent hexes are subject of dragon breath calculation
+	{
+		std::vector<BattleHex> hexes; //only one, in fact
+		int pseudoVector = destinationTile.hex - hex;
+		switch(pseudoVector)
 		{
-			std::vector<BattleHex> hexes; //only one, in fact
-			int pseudoVector = destinationTile.hex - hex;
-			switch(pseudoVector)
-			{
-			case 1:
-			case -1:
-				BattleHex::checkAndPush(destinationTile.hex + pseudoVector, hexes);
-				break;
-			case WN: //17 //left-down or right-down
-			case -WN: //-17 //left-up or right-up
-			case WN + 1: //18 //right-down
-			case -WN + 1: //-16 //right-up
-				BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : -1), hexes);
-				break;
-			case WN - 1: //16 //left-down
-			case -WN - 1: //-18 //left-up
-				BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : 0), hexes);
-				break;
-			}
-			for(BattleHex tile : hexes)
-			{
-				//friendly stacks can also be damaged by Dragon Breath
-				if(battleGetStackByPos(tile, true))
-					at.friendlyCreaturePositions.insert(tile);
-			}
+		case 1:
+		case -1:
+			BattleHex::checkAndPush(destinationTile.hex + pseudoVector, hexes);
+			break;
+		case WN: //17 //left-down or right-down
+		case -WN: //-17 //left-up or right-up
+		case WN + 1: //18 //right-down
+		case -WN + 1: //-16 //right-up
+			BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : -1), hexes);
+			break;
+		case WN - 1: //16 //left-down
+		case -WN - 1: //-18 //left-up
+			BattleHex::checkAndPush(destinationTile.hex + pseudoVector + (((hex / WN) % 2) ? 1 : 0), hexes);
+			break;
+		}
+		for(BattleHex tile : hexes)
+		{
+			//friendly stacks can also be damaged by Dragon Breath
+			if(battleGetStackByPos(tile, true))
+				at.friendlyCreaturePositions.insert(tile);
 		}
 	}
 	return at;
@@ -1343,7 +1223,7 @@ std::set<const CStack*> CBattleInfoCallback::getAttackedCreatures(const CStack*
 	std::set<const CStack*> attackedCres;
 	RETURN_IF_NOT_BATTLE(attackedCres);
 
-	AttackableTiles at = getPotentiallyAttackableHexes(attacker, destinationTile, attackerPos, rangedAttack);
+	AttackableTiles at = getPotentiallyAttackableHexes(attacker, destinationTile, attackerPos);
 	for (BattleHex tile : at.hostileCreaturePositions) //all around & three-headed attack
 	{
 		const CStack * st = battleGetStackByPos(tile, true);

+ 1 - 1
lib/battle/CBattleInfoCallback.h

@@ -92,7 +92,7 @@ public:
 	bool isInTacticRange(BattleHex dest) const;
 	si8 battleGetTacticDist() const; //returns tactic distance for calling player or 0 if this player is not in tactic phase (for ALL_KNOWING actual distance for tactic side)
 
-	AttackableTiles getPotentiallyAttackableHexes(const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos, bool rangedAttack) const; //TODO: apply rotation to two-hex attacker
+	AttackableTiles getPotentiallyAttackableHexes(const CStack* attacker, BattleHex destinationTile, BattleHex attackerPos) const; //TODO: apply rotation to two-hex attacker
 	std::set<const CStack*> getAttackedCreatures(const CStack* attacker, BattleHex destinationTile, bool rangedAttack, BattleHex attackerPos = BattleHex::INVALID) const; //calculates range of multi-hex attacks
 	bool isToReverse(BattleHex hexFrom, BattleHex hexTo, bool curDir /*if true, creature is in attacker's direction*/, bool toDoubleWide, bool toDir) const; //determines if creature should be reversed (it stands on hexFrom and should 'see' hexTo)
 	bool isToReverseHlp(BattleHex hexFrom, BattleHex hexTo, bool curDir) const; //helper for isToReverse