@@ -47,30 +47,33 @@ namespace banggame {
4747 m_disablers.emplace (key, std::move (fun));
4848 }
4949
50- void disabler_map::do_remove_disablers (disabler_map_range range) {
51- for (const auto &[key, fun] : range) {
52- logging::debug (" remove_disabler() on {}: {}" , key, fun.target_type ());
53- }
50+ void disabler_map::remove_disabler (event_card_key key) {
51+ auto iterator = m_disablers.find (key);
52+ if (iterator == m_disablers.end ()) return ;
53+
54+ logging::debug (" remove_disabler() on {}: {}" , iterator->first , iterator->second .target_type ());
5455
55- for (auto [owner, c] : disableable_cards (m_game)) {
56- auto disables_c = [c](const auto &pair) { return pair.second (c); };
57- auto outside_range = rv::concat (
58- rn::subrange (m_disablers.begin (), range.begin ()),
59- rn::subrange (range.end (), m_disablers.end ())
60- );
56+ for (auto [owner, target_card] : disableable_cards (m_game)) {
57+ bool disabled_by_this = iterator->second (target_card);
58+
59+ bool disabled_by_other = false ;
60+ for (auto it = m_disablers.begin (); it != m_disablers.end (); ++it) {
61+ if (it != iterator && it->second (target_card)) {
62+ disabled_by_other = true ;
63+ break ;
64+ }
65+ }
6166
62- // enables the card only if there are no disablers left after the removal of `range`
63- // AND the card is already disabled by at least one disabler in `range`
64- if (rn::any_of (range, disables_c) && rn::none_of (outside_range, disables_c)) {
65- for (const equip_holder &holder : c->equips ) {
67+ if (disabled_by_this && !disabled_by_other) {
68+ for (const equip_holder &holder : target_card->equips ) {
6669 if (!holder.is_nodisable ()) {
67- holder.on_enable (c , owner);
70+ holder.on_enable (target_card , owner);
6871 }
6972 }
7073 }
7174 }
7275
73- m_disablers.erase (range. begin (), range. end () );
76+ m_disablers.erase (iterator );
7477 }
7578
7679 card_ptr disabler_map::get_disabler (const_card_ptr target_card, bool check_disable_use) const {
0 commit comments