1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-25 21:38:59 +02:00

Fix BERSERK effect

This commit is contained in:
AlexVinS 2015-04-03 05:08:13 +03:00
parent c3ea9637dd
commit e42ca15a0d

View File

@ -1231,37 +1231,36 @@ std::set<BattleHex> CBattleInfoCallback::getStoppers(BattlePerspective::BattlePe
std::pair<const CStack *, BattleHex> CBattleInfoCallback::getNearestStack(const CStack * closest, boost::logic::tribool attackerOwned) const
{
auto reachability = getReachability(closest);
auto avHexes = battleGetAvailableHexes(closest, false);
// I hate std::pairs with their undescriptive member names first / second
struct DistStack
{
int distanceToPred;
int distanceToPred;
BattleHex destination;
const CStack *stack;
};
std::vector<DistStack> stackPairs; //pairs <<distance, hex>, stack>
for(int g=0; g<GameConstants::BFIELD_SIZE; ++g)
{
const CStack * atG = battleGetStackByPos(g);
if(!atG || atG->ID == closest->ID) //if there is no stack or we are the closest one
continue;
std::vector<DistStack> stackPairs;
if(boost::logic::indeterminate(attackerOwned) || atG->attackerOwned == attackerOwned)
{
if (reachability.isReachable(g))
//FIXME: hexes occupied by enemy stack are not accessible. Need to use BattleInfo::getPath or similar
std::vector<const CStack *> possibleStacks = battleGetStacksIf([=](const CStack * s)
{
return s != closest && s->alive() && (boost::logic::indeterminate(attackerOwned) || s->attackerOwned == attackerOwned);
}, false);
for(const CStack * st : possibleStacks)
for(BattleHex hex : avHexes)
if(CStack::isMeleeAttackPossible(closest, st, hex))
{
DistStack hlp = {reachability.distances[reachability.predecessors[g]], atG};
DistStack hlp = {reachability.distances[st->position], hex, st};
stackPairs.push_back(hlp);
}
}
}
if (stackPairs.size())
{
auto comparator = [](DistStack lhs, DistStack rhs) { return lhs.distanceToPred < rhs.distanceToPred; };
auto minimal = boost::min_element(stackPairs, comparator);
return std::make_pair(minimal->stack, reachability.predecessors[minimal->stack->position]);
return std::make_pair(minimal->stack, minimal->destination);
}
else
return std::make_pair<const CStack * , BattleHex>(nullptr, BattleHex::INVALID);