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)};
12+ static auto disableable_cards (const player_list &players) {
13+ return players | rv::for_each ([](player_ptr p) {
14+ return rv::concat (
15+ p->m_table ,
16+ p->m_characters | rv::take (1 )
17+ );
1518 });
16- };
17-
18- static auto disableable_cards (game_ptr game) {
19- 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- })
31- );
3219 }
3320
3421 void disabler_map::add_disabler (event_card_key key, card_disabler_fun &&fun) {
3522 logging::debug (" add_disabler() on {}: {}" , key, fun.target_type ());
3623
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) {
24+ for (card_ptr target_card : disableable_cards (get_players () )) {
25+ if (fun (target_card ) && !is_disabled (target_card )) {
26+ for (const equip_holder &holder : target_card ->equips | rv::reverse) {
4027 if (!holder.is_nodisable ()) {
41- holder.on_disable (c, owner);
28+ holder.on_disable (target_card, target_card-> owner );
4229 }
4330 }
4431 }
@@ -47,30 +34,25 @@ namespace banggame {
4734 m_disablers.emplace (key, std::move (fun));
4835 }
4936
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- }
37+ void disabler_map::remove_disabler (event_card_key key) {
38+ auto iterator = m_disablers.find (key);
39+ if (iterator == m_disablers.end ()) return ;
40+
41+ logging::debug (" remove_disabler() on {}: {}" , iterator->first , iterator->second .target_type ());
5442
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 ) {
43+ for (card_ptr target_card : disableable_cards (get_players ())) {
44+ if (iterator->second (target_card) && rn::none_of (m_disablers, [&](const auto &other_disabler) {
45+ return &other_disabler != &*iterator && other_disabler.second (target_card);
46+ })) {
47+ for (const equip_holder &holder : target_card->equips ) {
6648 if (!holder.is_nodisable ()) {
67- holder.on_enable (c, owner);
49+ holder.on_enable (target_card, target_card-> owner );
6850 }
6951 }
7052 }
7153 }
7254
73- m_disablers.erase (range. begin (), range. end () );
55+ m_disablers.erase (iterator );
7456 }
7557
7658 card_ptr disabler_map::get_disabler (const_card_ptr target_card, bool check_disable_use) const {
0 commit comments