diff options
Diffstat (limited to 'src/game/ThreatManager.cpp')
| -rw-r--r-- | src/game/ThreatManager.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/game/ThreatManager.cpp b/src/game/ThreatManager.cpp index ab6e02801c9..16372b989e2 100644 --- a/src/game/ThreatManager.cpp +++ b/src/game/ThreatManager.cpp @@ -267,12 +267,27 @@ HostilReference* ThreatContainer::selectNextVictim(Creature* pAttacker, HostilRe { HostilReference* currentRef = NULL; bool found = false; + + std::list<HostilReference*>::iterator lastRef = iThreatList.end(); + lastRef--; + for(std::list<HostilReference*>::iterator iter = iThreatList.begin(); iter != iThreatList.end() && !found; ++iter) { currentRef = (*iter); Unit* target = currentRef->getTarget(); assert(target); // if the ref has status online the target must be there ! + + // some units are prefered in comparison to others + if(iter != lastRef && (target->IsImmunedToDamage(pAttacker->GetMeleeDamageSchoolMask(), false) || + target->hasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_FLEEING) + ) ) + { + // current victim is a second choice target, so don't compare threat with it below + if(currentRef == pCurrentVictim) + pCurrentVictim = NULL; + continue; + } if(!pAttacker->IsOutOfThreatArea(target)) // skip non attackable currently targets { |
