manabrew_engine/trigger/
trigger_vote.rs1use 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}