diff --git a/client/battle/BattleActionsController.cpp b/client/battle/BattleActionsController.cpp index 1aba3a286..dfa14e95a 100644 --- a/client/battle/BattleActionsController.cpp +++ b/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: diff --git a/client/gui/CursorHandler.h b/client/gui/CursorHandler.h index 3ccd41ced..7632dbaf3 100644 --- a/client/gui/CursorHandler.h +++ b/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; diff --git a/lib/spells/effects/Sacrifice.cpp b/lib/spells/effects/Sacrifice.cpp index 5360203d8..52820e85b 100644 --- a/lib/spells/effects/Sacrifice.cpp +++ b/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); }