Skip to main content

manabrew_engine/trigger/
trigger_vote.rs

1use serde::{Deserialize, Serialize};
2
3use crate::event::RunParams;
4use crate::game::GameState;
5use crate::parsing::Params;
6use crate::spellability::SpellAbility;
7use crate::trigger::TriggerType;
8
9use super::trigger::{Trigger, TriggerBehavior};
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct TriggerVote {}
13
14impl TriggerVote {
15    pub fn parse(_params: &Params) -> Box<dyn TriggerBehavior> {
16        Box::new(Self {})
17    }
18}
19
20#[typetag::serde]
21impl TriggerBehavior for TriggerVote {
22    fn trigger_type(&self) -> TriggerType {
23        TriggerType::Vote
24    }
25
26    fn perform_test(&self, _trigger: &Trigger, _params: &RunParams, _game: &GameState) -> bool {
27        true
28    }
29
30    fn set_triggering_objects(
31        &self,
32        trigger: &Trigger,
33        sa: &mut SpellAbility,
34        params: &RunParams,
35        game: &GameState,
36    ) {
37        let host_controller = trigger.base.card_trait_base.host_controller(game);
38        let Some(all_votes) = params.all_votes.as_ref() else {
39            return;
40        };
41
42        let mut same = Vec::new();
43        let mut diff = Vec::new();
44        for (_, voters) in all_votes {
45            let host_voted_here = voters.contains(&host_controller);
46            for &player in voters {
47                if player == host_controller || game.opponent_of(host_controller) != player {
48                    continue;
49                }
50                let bucket = if host_voted_here {
51                    &mut same
52                } else {
53                    &mut diff
54                };
55                if !bucket.contains(&player) {
56                    bucket.push(player);
57                }
58            }
59        }
60
61        if !same.is_empty() {
62            let csv = same
63                .iter()
64                .map(|player_id| player_id.0.to_string())
65                .collect::<Vec<_>>()
66                .join(",");
67            sa.set_triggering_object(crate::ability::AbilityKey::OpponentVotedSame, &csv);
68        }
69        if !diff.is_empty() {
70            let csv = diff
71                .iter()
72                .map(|player_id| player_id.0.to_string())
73                .collect::<Vec<_>>()
74                .join(",");
75            sa.set_triggering_object(crate::ability::AbilityKey::OpponentVotedDiff, &csv);
76        }
77    }
78
79    fn get_important_stack_objects(&self, _trigger: &Trigger, _sa: &SpellAbility) -> String {
80        String::new()
81    }
82}