99
1010namespace banggame {
1111
12- static auto to_pairs (auto &&left) {
13- return rv::transform ([left=std::move (left)](auto &&right) {
14- return std::pair{left, std::move (right)};
15- });
16- };
17-
18- static auto disableable_cards (game_ptr game) {
12+ static auto disableable_cards (game_ptr m_game) {
1913 return rv::concat (
20- game->m_scenario_cards
21- | rv::take_last (1 ) | to_pairs (game->m_first_player ),
22- game->m_wws_scenario_cards
23- | rv::take_last (1 ) | to_pairs (game->m_first_player ),
24- game->m_players
25- | rv::for_each ([](player_ptr p) {
26- return rv::concat (
27- p->m_table ,
28- p->m_characters | rv::take (1 )
29- ) | to_pairs (p);
30- })
14+ m_game->m_scenario_cards | rv::take_last (1 ),
15+ m_game->m_wws_scenario_cards | rv::take_last (1 ),
16+ m_game->m_players | rv::for_each ([](player_ptr p) {
17+ return rv::concat (
18+ p->m_table ,
19+ p->m_characters | rv::take (1 )
20+ );
21+ })
3122 );
3223 }
3324
3425 void disabler_map::add_disabler (event_card_key key, card_disabler_fun &&fun) {
3526 logging::debug (" add_disabler() on {}: {}" , key, fun.target_type ());
3627
37- for (auto [owner, c] : disableable_cards (m_game)) {
38- if (fun (c) && !is_disabled (c)) {
39- for (const equip_holder &holder : c->equips | rv::reverse) {
28+ for (card_ptr target_card : disableable_cards (key.target_card ->m_game )) {
29+ if (fun (target_card) && !is_disabled (target_card)) {
30+ player_ptr owner = target_card->owner ? target_card->owner : target_card->m_game ->m_first_player ;
31+ for (const equip_holder &holder : target_card->equips | rv::reverse) {
4032 if (!holder.is_nodisable ()) {
41- holder.on_disable (c , owner);
33+ holder.on_disable (target_card , owner);
4234 }
4335 }
4436 }
@@ -47,30 +39,26 @@ namespace banggame {
4739 m_disablers.emplace (key, std::move (fun));
4840 }
4941
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- }
42+ void disabler_map::remove_disabler (event_card_key key) {
43+ auto iterator = m_disablers.find (key);
44+ if (iterator == m_disablers.end ()) return ;
45+
46+ logging::debug (" remove_disabler() on {}: {}" , iterator->first , iterator->second .target_type ());
5447
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- );
61-
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 ) {
48+ for (card_ptr target_card : disableable_cards (key.target_card ->m_game )) {
49+ if (iterator->second (target_card) && rn::none_of (m_disablers, [&](const auto &other_disabler) {
50+ return &other_disabler != &*iterator && other_disabler.second (target_card);
51+ })) {
52+ player_ptr owner = target_card->owner ? target_card->owner : target_card->m_game ->m_first_player ;
53+ for (const equip_holder &holder : target_card->equips ) {
6654 if (!holder.is_nodisable ()) {
67- holder.on_enable (c , owner);
55+ holder.on_enable (target_card , owner);
6856 }
6957 }
7058 }
7159 }
7260
73- m_disablers.erase (range. begin (), range. end () );
61+ m_disablers.erase (iterator );
7462 }
7563
7664 card_ptr disabler_map::get_disabler (const_card_ptr target_card, bool check_disable_use) const {
0 commit comments