Skip to content

Commit 723c391

Browse files
committed
rework disabler_map
- simplify disableable_cards - add virtual get_players() - fixes interaction between cholera and big fifty
1 parent eb77486 commit 723c391

12 files changed

Lines changed: 42 additions & 74 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: 22 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,23 @@
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)};
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 {

src/game/disabler_map.h

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,30 +39,15 @@ 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;
43+
44+
protected:
45+
virtual const player_list &get_players() const = 0;
5146

5247
public:
53-
disabler_map(game_ptr m_game): m_game(m_game) {}
54-
5548
void add_disabler(event_card_key key, card_disabler_fun &&fun);
5649

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-
}
50+
void remove_disabler(event_card_key key);
6651

6752
card_ptr get_disabler(const_card_ptr target_card, bool check_disable_use = false) const;
6853

0 commit comments

Comments
 (0)