Browse Source

A common function is used to get range limit hexes

getRangeLimitHexes()
krs 2 năm trước cách đây
mục cha
commit
192f82152d

+ 42 - 51
client/battle/BattleFieldController.cpp

@@ -502,50 +502,18 @@ std::vector<BattleHex> BattleFieldController::getSootingRangeHexes()
 	return sootingRangeHexes;
 }
 
-std::vector<BattleHex> BattleFieldController::getRangedFullDamageLimitHexes(std::vector<BattleHex> rangedFullDamageHexes)
+std::vector<BattleHex> BattleFieldController::getRangeLimitHexes(BattleHex hoveredHex, std::vector<BattleHex> rangeHexes, uint8_t distanceToLimit)
 {
-	std::vector<BattleHex> rangedFullDamageLimitHexes; // used for return
+	std::vector<BattleHex> limitHexes; // used for return
 
-	// if not a hovered arcer unit -> return
-	auto hoveredHex = getHoveredHex();
-	const CStack * hoveredStack = owner.curInt->cb->battleGetStackByPos(hoveredHex, true);
-
-	if(!(hoveredStack && hoveredStack->isShooter()))
-		return rangedFullDamageLimitHexes;
-
-	auto rangedFullDamageDistance = hoveredStack->getRangedFullDamageDistance();
-
-	// from ranged full damage hexes get only the ones at the limit
-	for(auto & hex : rangedFullDamageHexes)
-	{
-		if(BattleHex::getDistance(hoveredHex, hex) == rangedFullDamageDistance)
-			rangedFullDamageLimitHexes.push_back(hex);
-	}
-
-	return rangedFullDamageLimitHexes;
-}
-
-std::vector<BattleHex> BattleFieldController::getShootingRangeLimitHexes(std::vector<BattleHex> shootingRangeHexes)
-{
-	std::vector<BattleHex> shootingRangeLimitHexes; // used for return
-
-	// if not a hovered arcer unit -> return
-	auto hoveredHex = getHoveredHex();
-	const CStack * hoveredStack = owner.curInt->cb->battleGetStackByPos(hoveredHex, true);
-
-	if(!(hoveredStack && hoveredStack->isShooter()))
-		return shootingRangeLimitHexes;
-
-	auto shootingRangeDistance = hoveredStack->getSootingRangeDistance();
-
-	// from ranged full damage hexes get only the ones at the limit
-	for(auto & hex : shootingRangeHexes)
+	// from range hexes get only the ones at the limit
+	for(auto & hex : rangeHexes)
 	{
-		if(BattleHex::getDistance(hoveredHex, hex) == shootingRangeDistance)
-			shootingRangeLimitHexes.push_back(hex);
+		if(BattleHex::getDistance(hoveredHex, hex) == distanceToLimit)
+			limitHexes.push_back(hex);
 	}
 
-	return shootingRangeLimitHexes;
+	return limitHexes;
 }
 
 std::vector<std::vector<BattleHex::EDir>> BattleFieldController::getOutsideNeighbourDirectionsForLimitHexes(std::vector<BattleHex> wholeRangeHexes, std::vector<BattleHex> rangeLimitHexes)
@@ -629,20 +597,35 @@ void BattleFieldController::showHighlightedHexes(Canvas & canvas)
 	std::set<BattleHex> hoveredSpellHexes = getHighlightedHexesForSpellRange();
 	std::set<BattleHex> hoveredMoveHexes  = getHighlightedHexesForMovementTarget();
 
-	if(getHoveredHex() == BattleHex::INVALID)
+	BattleHex hoveredHex = getHoveredHex();
+	if(hoveredHex == BattleHex::INVALID)
 		return;
 
-	// calculate array with highlight images for ranged full damage limit
-	std::vector<BattleHex> rangedFullDamageHexes = getRangedFullDamageHexes();
-	std::vector<BattleHex> rangedFullDamageLimitHexes = getRangedFullDamageLimitHexes(rangedFullDamageHexes);
-	std::vector<std::vector<BattleHex::EDir>> rangedFullDamageLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(rangedFullDamageHexes, rangedFullDamageLimitHexes);
-	std::vector<std::shared_ptr<IImage>> rangedFullDamageLimitHexesHighligts = calculateRangeHighlightImages(rangedFullDamageLimitHexesNeighbourDirections, rangedFullDamageLimitImages);
-	
-	// calculate array with highlight images for shooting range limit
-	std::vector<BattleHex> shootingRangeHexes = getSootingRangeHexes();
-	std::vector<BattleHex> shootingRangeLimitHexes = getShootingRangeLimitHexes(shootingRangeHexes);
-	std::vector<std::vector<BattleHex::EDir>> shootingRangeLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(shootingRangeHexes, shootingRangeLimitHexes);
-	std::vector<std::shared_ptr<IImage>> shootingRangeLimitHexesHighligts = calculateRangeHighlightImages(shootingRangeLimitHexesNeighbourDirections, shootingRangeLimitImages);
+	const CStack * hoveredStack = getHoveredStack();
+
+	std::vector<BattleHex> rangedFullDamageLimitHexes;
+	std::vector<BattleHex> shootingRangeLimitHexes;
+
+	std::vector<std::shared_ptr<IImage>> rangedFullDamageLimitHexesHighligts;
+	std::vector<std::shared_ptr<IImage>> shootingRangeLimitHexesHighligts;
+
+	// skip range limit calculations if unit hovered is not a shooter
+	if(hoveredStack && hoveredStack->isShooter())
+	{
+		// calculate array with highlight images for ranged full damage limit
+		std::vector<BattleHex> rangedFullDamageHexes = getRangedFullDamageHexes();
+		auto rangedFullDamageDistance = hoveredStack->getRangedFullDamageDistance();
+		rangedFullDamageLimitHexes = getRangeLimitHexes(hoveredHex, rangedFullDamageHexes, rangedFullDamageDistance);
+		std::vector<std::vector<BattleHex::EDir>> rangedFullDamageLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(rangedFullDamageHexes, rangedFullDamageLimitHexes);
+		rangedFullDamageLimitHexesHighligts = calculateRangeHighlightImages(rangedFullDamageLimitHexesNeighbourDirections, rangedFullDamageLimitImages);
+
+		// calculate array with highlight images for shooting range limit
+		std::vector<BattleHex> shootingRangeHexes = getSootingRangeHexes();
+		auto shootingRangeDistance = hoveredStack->getSootingRangeDistance();
+		shootingRangeLimitHexes = getRangeLimitHexes(hoveredHex, shootingRangeHexes, shootingRangeDistance);
+		std::vector<std::vector<BattleHex::EDir>> shootingRangeLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(shootingRangeHexes, shootingRangeLimitHexes);
+		shootingRangeLimitHexesHighligts = calculateRangeHighlightImages(shootingRangeLimitHexesNeighbourDirections, shootingRangeLimitImages);
+	}
 
 	auto const & hoveredMouseHexes = owner.actionsController->currentActionSpellcasting(getHoveredHex()) ? hoveredSpellHexes : hoveredMoveHexes;
 
@@ -719,6 +702,14 @@ BattleHex BattleFieldController::getHoveredHex()
 	return hoveredHex;
 }
 
+const CStack* BattleFieldController::getHoveredStack()
+{
+	auto hoveredHex = getHoveredHex();
+	const CStack* hoveredStack = owner.curInt->cb->battleGetStackByPos(hoveredHex, true);
+
+	return hoveredStack;
+}
+
 BattleHex BattleFieldController::getHexAtPosition(Point hoverPos)
 {
 	if (owner.attackingHero)

+ 5 - 4
client/battle/BattleFieldController.h

@@ -65,10 +65,8 @@ class BattleFieldController : public CIntObject
 
 	std::vector<BattleHex> getSootingRangeHexes();
 
-	/// get only hexes at the limit of a ranged unit's full damage range
-	std::vector<BattleHex> getRangedFullDamageLimitHexes(std::vector<BattleHex> rangedFullDamageHexes);
-
-	std::vector<BattleHex> getShootingRangeLimitHexes(std::vector<BattleHex> shootingRangeHexes);
+	/// get only hexes at the limit of a range
+	std::vector<BattleHex> getRangeLimitHexes(BattleHex hoveredHex, std::vector<BattleHex> hexRange, uint8_t distanceToLimit);
 
 	/// get an array that has for each hex in range, an aray with all directions where an ouside neighbour hex exists
 	std::vector<std::vector<BattleHex::EDir>> getOutsideNeighbourDirectionsForLimitHexes(std::vector<BattleHex> rangedFullDamageHexes, std::vector<BattleHex> rangedFullDamageLimitHexes);
@@ -123,6 +121,9 @@ public:
 	/// Returns ID of currently hovered hex or BattleHex::INVALID if none
 	BattleHex getHoveredHex();
 
+	/// Returns the currently hovered stack
+	const CStack* getHoveredStack();
+
 	/// returns true if selected tile can be attacked in melee by current stack
 	bool isTileAttackable(const BattleHex & number) const;