1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00

Merge pull request #6262 from MichalZr6/small_fixes

Battle fixes: Sacrifice targeting, First Aid Tent possible actions. GUI: cursor init stall fix
This commit is contained in:
Ivan Savenko
2025-11-11 20:25:59 +02:00
committed by GitHub
3 changed files with 17 additions and 5 deletions

View File

@@ -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:

View File

@@ -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;

View File

@@ -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);
}