Skip to content

Commit 829e6ce

Browse files
committed
rework remove_disabler
- fixes interactor between cholera and big fifty
1 parent eb77486 commit 829e6ce

10 files changed

Lines changed: 30 additions & 38 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: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {

src/game/disabler_map.h

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,28 +41,17 @@ namespace banggame {
4141
private:
4242
using disabler_map_t = std::multimap<event_card_key, card_disabler_fun, std::less<>>;
4343
using disabler_map_iterator = disabler_map_t::const_iterator;
44-
using disabler_map_range = rn::subrange<disabler_map_iterator>;
4544

4645
private:
4746
disabler_map_t m_disablers;
4847
game_ptr m_game;
4948

50-
void do_remove_disablers(disabler_map_range range);
51-
5249
public:
5350
disabler_map(game_ptr m_game): m_game(m_game) {}
5451

5552
void add_disabler(event_card_key key, card_disabler_fun &&fun);
5653

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

6756
card_ptr get_disabler(const_card_ptr target_card, bool check_disable_use = false) const;
6857

0 commit comments

Comments
 (0)