@@ -39,37 +39,31 @@ namespace banggame {
3939
4040 namespace contexts {
4141 struct selected_cubes {
42- const_card_ptr origin_card;
42+ card_ptr origin_card;
4343 card_list cubes;
44- int ncubes;
44+
45+ selected_cubes (card_ptr origin_card, card_list cubes)
46+ : origin_card{origin_card}
47+ , cubes{std::move (cubes)} {}
48+
49+ selected_cubes (card_ptr origin_card, int ncubes)
50+ : origin_card{origin_card}
51+ , cubes{static_cast <size_t >(ncubes), origin_card} {}
52+
53+ static auto get_all_cubes (const effect_context &ctx) {
54+ return ctx.get_all <selected_cubes>() | rv::for_each (&selected_cubes::cubes);
55+ }
4556
4657 static bool contains (const effect_context &ctx, const_card_ptr origin_card) {
47- for (const selected_cubes &entry : ctx.get_all <selected_cubes>()) {
48- if (entry.origin_card == origin_card && !entry.cubes .empty ()) {
49- return true ;
50- }
51- }
52- return false ;
58+ return rn::contains (ctx.get_all <selected_cubes>(), origin_card, &selected_cubes::origin_card);
5359 }
5460
5561 static int count_repeats (const effect_context &ctx, const_card_ptr origin_card) {
56- int result = 0 ;
57- for (const selected_cubes &entry : ctx.get_all <selected_cubes>()) {
58- if (entry.origin_card == origin_card && entry.ncubes != 0 ) {
59- result += entry.cubes .size () / entry.ncubes ;
60- }
61- }
62- return result;
62+ return static_cast <int >(rn::count (ctx.get_all <selected_cubes>(), origin_card, &selected_cubes::origin_card));
6363 }
6464
6565 static int count_selected_on (const effect_context &ctx, const_card_ptr target_card) {
66- int result = 0 ;
67- for (const selected_cubes &entry : ctx.get_all <selected_cubes>()) {
68- for (card_ptr c : entry.cubes ) {
69- if (c == target_card) ++result;
70- }
71- }
72- return result;
66+ return static_cast <int >(rn::count (get_all_cubes (ctx), target_card));
7367 }
7468 };
7569 }
0 commit comments