Skip to content

Commit

Permalink
fix leadership animation played when weapon don't match [filter_weapo…
Browse files Browse the repository at this point in the history
…n] (#4758)
  • Loading branch information
newfrenchy83 committed Apr 4, 2020
1 parent 8b3defb commit 1a2ec86
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 14 deletions.
9 changes: 1 addition & 8 deletions src/actions/attack.cpp
Expand Up @@ -1563,14 +1563,7 @@ void attack_unit_and_advance(const map_location& attacker,

int under_leadership(const unit &u, const map_location& loc, const_attack_ptr weapon, const_attack_ptr opp_weapon)
{
unit_ability_list abil = u.get_abilities("leadership", loc);
for(unit_ability_list::iterator i = abil.begin(); i != abil.end();) {
if((!u.ability_affects_weapon(*i->first, weapon, false) || !u.ability_affects_weapon(*i->first, opp_weapon, true))) {
i = abil.erase(i);
} else {
++i;
}
}
unit_ability_list abil = u.get_abilities_weapons("leadership", loc, weapon, opp_weapon);
unit_abilities::effect leader_effect(abil, 0, false);
return leader_effect.get_composite_value();
}
Expand Down
13 changes: 13 additions & 0 deletions src/units/abilities.cpp
Expand Up @@ -223,6 +223,19 @@ unit_ability_list unit::get_abilities(const std::string& tag_name, const map_loc
return res;
}

unit_ability_list unit::get_abilities_weapons(const std::string& tag_name, const map_location& loc, const_attack_ptr weapon, const_attack_ptr opp_weapon) const
{
unit_ability_list res = get_abilities(tag_name, loc);
for(unit_ability_list::iterator i = res.begin(); i != res.end();) {
if((!ability_affects_weapon(*i->first, weapon, false) || !ability_affects_weapon(*i->first, opp_weapon, true))) {
i = res.erase(i);
} else {
++i;
}
}
return res;
}

std::vector<std::string> unit::get_ability_list() const
{
std::vector<std::string> res;
Expand Down
4 changes: 2 additions & 2 deletions src/units/udisplay.cpp
Expand Up @@ -646,7 +646,7 @@ void unit_attack(display * disp, game_board & board,

animator.add_animation(&defender, defender_anim, def->get_location(), true, text, {255, 0, 0});

for(const unit_ability& ability : attacker.get_abilities("leadership")) {
for(const unit_ability& ability : attacker.get_abilities_weapons("leadership", attack.shared_from_this(), secondary_attack)) {
if(ability.second == a) {
continue;
}
Expand All @@ -663,7 +663,7 @@ void unit_attack(display * disp, game_board & board,
hit_type, attack.shared_from_this(), secondary_attack, swing);
}

for(const unit_ability& ability : defender.get_abilities("resistance")) {
for(const unit_ability& ability : defender.get_abilities_weapons("resistance", attack.shared_from_this(), secondary_attack)) {
if(ability.second == a) {
continue;
}
Expand Down
4 changes: 2 additions & 2 deletions src/units/unit.cpp
Expand Up @@ -1693,9 +1693,9 @@ int unit::resistance_against(const std::string& damage_name,bool attacker,const
{
int res = movement_type_.resistance_against(damage_name);

unit_ability_list resistance_abilities = get_abilities("resistance",loc);
unit_ability_list resistance_abilities = get_abilities_weapons("resistance",loc, weapon, opp_weapon);
for(unit_ability_list::iterator i = resistance_abilities.begin(); i != resistance_abilities.end();) {
if(!resistance_filter_matches(*i->first, attacker, damage_name, 100-res) || (!ability_affects_weapon(*i->first, weapon, false) || !ability_affects_weapon(*i->first, opp_weapon, true))) {
if(!resistance_filter_matches(*i->first, attacker, damage_name, 100-res)) {
i = resistance_abilities.erase(i);
} else {
++i;
Expand Down
12 changes: 10 additions & 2 deletions src/units/unit.hpp
Expand Up @@ -1638,6 +1638,13 @@ class unit
{
return get_abilities(tag_name, loc_);
}

unit_ability_list get_abilities_weapons(const std::string& tag_name, const map_location& loc, const_attack_ptr weapon = nullptr, const_attack_ptr opp_weapon = nullptr) const;

unit_ability_list get_abilities_weapons(const std::string& tag_name, const_attack_ptr weapon = nullptr, const_attack_ptr opp_weapon = nullptr) const
{
return get_abilities_weapons(tag_name, loc_, weapon, opp_weapon);
}

/**
* Gets the names and descriptions of this unit's abilities. Location-independent variant
Expand Down Expand Up @@ -1686,8 +1693,6 @@ class unit
*/
void remove_ability_by_id(const std::string& ability);

///filters the weapons that condition the use of abilities for combat ([resistance],[leadership] or abilities used like specials(deprecated in two last cases)
bool ability_affects_weapon(const config& cfg, const_attack_ptr weapon, bool is_opp) const;

private:
/**
Expand Down Expand Up @@ -1715,6 +1720,9 @@ class unit
* @param loc The location on which to resolve the ability
*/
bool ability_affects_self(const std::string& ability, const config& cfg, const map_location& loc) const;

///filters the weapons that condition the use of abilities for combat ([resistance],[leadership] or abilities used like specials(deprecated in two last cases)
bool ability_affects_weapon(const config& cfg, const_attack_ptr weapon, bool is_opp) const;

public:
/** Get the unit formula manager. */
Expand Down

0 comments on commit 1a2ec86

Please sign in to comment.