subtr-actor 1.1.0

Rocket League replay transformer
Documentation
use super::*;

/// Per-player accumulated demolitions inflicted and taken.
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, ts_rs::TS)]
#[ts(export)]
pub struct DemoPlayerStats {
    pub demos_inflicted: u32,
    pub demos_taken: u32,
}

/// Per-team accumulated demolition stats.
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, ts_rs::TS)]
#[ts(export)]
pub struct DemoTeamStats {
    pub demos_inflicted: u32,
}

/// Accumulates demolition stats over the replay from kill/death events.
#[derive(Debug, Clone, Default, PartialEq)]
pub struct DemoStatsAccumulator {
    player_stats: HashMap<PlayerId, DemoPlayerStats>,
    team_zero_stats: DemoTeamStats,
    team_one_stats: DemoTeamStats,
}

impl DemoStatsAccumulator {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn player_stats(&self) -> &HashMap<PlayerId, DemoPlayerStats> {
        &self.player_stats
    }

    pub fn team_zero_stats(&self) -> &DemoTeamStats {
        &self.team_zero_stats
    }

    pub fn team_one_stats(&self) -> &DemoTeamStats {
        &self.team_one_stats
    }

    pub fn apply_demolition_event(&mut self, event: &DemolitionEvent) {
        self.player_stats
            .entry(event.attacker.clone())
            .or_default()
            .demos_inflicted += 1;
        match event.attacker_is_team_0 {
            Some(true) => self.team_zero_stats.demos_inflicted += 1,
            Some(false) => self.team_one_stats.demos_inflicted += 1,
            None => {}
        }

        self.player_stats
            .entry(event.victim.clone())
            .or_default()
            .demos_taken += 1;
    }
}