Browse Source

Merge pull request #6262 from MichalZr6/small_fixes

Battle fixes: Sacrifice targeting, First Aid Tent possible actions. GUI: cursor init stall fix
Ivan Savenko 3 weeks ago
parent
commit
4d16a8d4fb

+ 9 - 1
client/battle/BattleActionsController.cpp

@@ -264,6 +264,7 @@ void BattleActionsController::reorderPossibleActionsPriority(const CStack * stac
 			case PossiblePlayerBattleAction::NO_LOCATION:
 			case PossiblePlayerBattleAction::FREE_LOCATION:
 			case PossiblePlayerBattleAction::OBSTACLE:
+			case PossiblePlayerBattleAction::SACRIFICE:
 				if(!stack->hasBonusOfType(BonusType::NO_SPELLCAST_BY_DEFAULT) && targetStack != nullptr)
 				{
 					PlayerColor stackOwner = owner.getBattle()->battleGetOwner(targetStack);
@@ -698,7 +699,14 @@ bool BattleActionsController::actionIsLegal(PossiblePlayerBattleAction action, c
 			return selectedStack && isCastingPossibleHere(action.spell().toSpell(), selectedStack, targetHex);
 
 		case PossiblePlayerBattleAction::SACRIFICE: //choose our living stack to sacrifice
-			return targetStack && targetStack != selectedStack && targetStackOwned && targetStack->alive();
+		{
+			if(!targetStack)
+				return false;
+
+			auto unit = targetStack->acquire();
+			return targetStack != selectedStack && targetStackOwned && targetStack->alive()
+					&& unit->isLiving() && !unit->hasBonusOfType(BonusType::MECHANICAL);
+		}
 
 		case PossiblePlayerBattleAction::OBSTACLE:
 		case PossiblePlayerBattleAction::FREE_LOCATION:

+ 1 - 1
client/gui/CursorHandler.h

@@ -132,7 +132,7 @@ class CursorHandler final
 	Point pos;
 	float frameTime;
 	int32_t currentCursorIndex;
-	int32_t currentFrame;
+	int32_t currentFrame {};
 	Cursor::ShowType showType;
 	bool showing;
 

+ 7 - 3
lib/spells/effects/Sacrifice.cpp

@@ -59,9 +59,10 @@ bool Sacrifice::applicable(Problem & problem, const Mechanics * m) const
 	bool targetExists = false;
 	bool targetToSacrificeExists = false;
 
-	for(auto & target : targets)
+	for(const battle::Unit * target : targets)
 	{
-		if(target->alive())
+		auto unit = target->acquire();
+		if(target->alive() && unit->isLiving() && !unit->hasBonusOfType(BonusType::MECHANICAL))
 			targetToSacrificeExists = true;
 		else if(target->isDead())
 			targetExists = true;
@@ -89,12 +90,15 @@ bool Sacrifice::applicable(Problem & problem, const Mechanics * m, const EffectT
 	if(!Heal::applicable(problem, m, healTarget))
 		return false;
 
+	if(healTarget.front().unitValue->alive())
+		return false;
+
 	if(target.size() == 2)
 	{
 		const auto *victim = target.at(1).unitValue;
 		if(!victim)
 			return false;
-		
+
 		return victim->alive() && getStackFilter(m, false, victim) && isReceptive(m, victim);
 	}