Skip to content

Commit 7430215

Browse files
committed
rework remove_disabler
- fixes interaction between cholera and big fifty
1 parent eb77486 commit 7430215

11 files changed

Lines changed: 40 additions & 73 deletions

File tree

src/effects/armedanddangerous/bigfifty.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace banggame {
1515
|| c == target->get_character();
1616
});
1717
origin->m_game->queue_action([=]{
18-
origin->m_game->remove_disablers(key);
18+
origin->m_game->remove_disabler(key);
1919
}, 90);
2020
origin->m_game->remove_listeners(key);
2121
}

src/effects/base/death.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,6 @@ namespace banggame {
181181
}
182182

183183
void revive_character(player_ptr target) {
184-
target->m_game->remove_disablers({ target->get_character(), 90 });
184+
target->m_game->remove_disabler({ target->get_character(), 90 });
185185
}
186186
}

src/effects/canyondiablo/brothel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace banggame {
3636
});
3737
auto clear_events = [target, event_key](player_ptr p) {
3838
if (p == target) {
39-
target->m_game->remove_disablers(event_key);
39+
target->m_game->remove_disabler(event_key);
4040
target->m_game->remove_listeners(event_key);
4141
}
4242
};

src/effects/dodgecity/bellestar.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ namespace banggame {
1616
});
1717
p->m_game->add_listener<event_type::on_turn_end>(target_card, [=](player_ptr target, bool skipped) {
1818
if (p == target) {
19-
p->m_game->remove_disablers({ target_card, 0 });
19+
p->m_game->remove_disabler({ target_card, 0 });
2020
}
2121
});
2222
}
2323

2424
void equip_bellestar::on_disable(card_ptr target_card, player_ptr target) {
25-
target->m_game->remove_disablers({ target_card, 0 });
25+
target->m_game->remove_disabler({ target_card, 0 });
2626
target->m_game->remove_listeners({ target_card, 0 });
2727
}
2828
}

src/effects/fistfulofcards/lasso.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ namespace banggame {
1111
}
1212

1313
void equip_lasso::on_disable(card_ptr target_card, player_ptr target) {
14-
target->m_game->remove_disablers(target_card);
14+
target->m_game->remove_disabler(target_card);
1515
}
1616
}

src/effects/highnoon/hangover.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ namespace banggame {
1212
}
1313

1414
void equip_hangover::on_disable(card_ptr target_card, player_ptr target) {
15-
target->m_game->remove_disablers(target_card);
15+
target->m_game->remove_disabler(target_card);
1616
}
1717
}

src/effects/highnoon/sermon.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ namespace banggame {
2020
}, true});
2121
});
2222
target->m_game->add_listener<event_type::on_turn_end>(target_card, [=](player_ptr p, bool skipped) {
23-
target->m_game->remove_disablers(target_card);
23+
target->m_game->remove_disabler(target_card);
2424
});
2525
}
2626

2727
void equip_sermon::on_disable(card_ptr target_card, player_ptr target) {
28-
target->m_game->remove_disablers(target_card);
28+
target->m_game->remove_disabler(target_card);
2929
target->m_game->remove_listeners(target_card);
3030
}
3131
}

src/effects/valleyofshadows/ghost.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace banggame {
1818

1919
void equip_disable_character::on_disable(card_ptr target_card, player_ptr target) {
2020
target->m_game->queue_action([=]{
21-
target->m_game->remove_disablers(target_card);
21+
target->m_game->remove_disabler(target_card);
2222
}, 49);
2323
}
2424

src/game/disabler_map.cpp

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,28 @@
99

1010
namespace 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 {

src/game/disabler_map.h

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,30 +39,12 @@ namespace banggame {
3939

4040
class disabler_map {
4141
private:
42-
using disabler_map_t = std::multimap<event_card_key, card_disabler_fun, std::less<>>;
43-
using disabler_map_iterator = disabler_map_t::const_iterator;
44-
using disabler_map_range = rn::subrange<disabler_map_iterator>;
45-
46-
private:
47-
disabler_map_t m_disablers;
48-
game_ptr m_game;
49-
50-
void do_remove_disablers(disabler_map_range range);
42+
std::multimap<event_card_key, card_disabler_fun> m_disablers;
5143

5244
public:
53-
disabler_map(game_ptr m_game): m_game(m_game) {}
54-
5545
void add_disabler(event_card_key key, card_disabler_fun &&fun);
5646

57-
void remove_disablers(event_card_key key) {
58-
auto [low, high] = m_disablers.equal_range(key);
59-
do_remove_disablers({low, high});
60-
}
61-
62-
void remove_disablers(card_ptr key) {
63-
auto [low, high] = m_disablers.equal_range(key);
64-
do_remove_disablers({low, high});
65-
}
47+
void remove_disabler(event_card_key key);
6648

6749
card_ptr get_disabler(const_card_ptr target_card, bool check_disable_use = false) const;
6850

0 commit comments

Comments
 (0)