subtr-actor 0.11.0

Rocket League replay transformer
Documentation
use super::*;
use boxcars::RemoteId;

fn player(id: u32, is_team_0: bool) -> PlayerSample {
    PlayerSample {
        player_id: RemoteId::SplitScreen(id),
        is_team_0,
        rigid_body: None,
        boost_amount: None,
        last_boost_amount: None,
        boost_active: false,
        dodge_active: false,
        powerslide_active: false,
        match_goals: None,
        match_assists: None,
        match_saves: None,
        match_shots: None,
        match_score: None,
    }
}

fn frame(frame_number: usize, time: f32) -> FrameInfo {
    FrameInfo {
        frame_number,
        time,
        dt: 1.0,
        seconds_remaining: None,
    }
}

fn active_demo() -> DemoEventSample {
    DemoEventSample {
        attacker: RemoteId::SplitScreen(0),
        victim: RemoteId::SplitScreen(1),
    }
}

#[test]
fn persistent_active_demo_samples_do_not_double_count() {
    let mut calculator = DemoCalculator::new();
    let players = PlayerFrameState {
        players: vec![player(0, true), player(1, false)],
    };

    for frame_number in 1..=12 {
        calculator
            .update(
                &frame(frame_number, frame_number as f32),
                &players,
                &FrameEventsState {
                    active_demos: vec![active_demo()],
                    ..FrameEventsState::default()
                },
            )
            .unwrap();
    }

    assert_eq!(
        calculator
            .player_stats()
            .get(&RemoteId::SplitScreen(0))
            .map(|stats| stats.demos_inflicted),
        Some(1)
    );
    assert_eq!(
        calculator
            .player_stats()
            .get(&RemoteId::SplitScreen(1))
            .map(|stats| stats.demos_taken),
        Some(1)
    );
    assert_eq!(calculator.timeline().len(), 2);

    calculator
        .update(&frame(13, 13.0), &players, &FrameEventsState::default())
        .unwrap();
    calculator
        .update(
            &frame(30, 30.0),
            &players,
            &FrameEventsState {
                active_demos: vec![active_demo()],
                ..FrameEventsState::default()
            },
        )
        .unwrap();

    assert_eq!(
        calculator
            .player_stats()
            .get(&RemoteId::SplitScreen(0))
            .map(|stats| stats.demos_inflicted),
        Some(2)
    );
    assert_eq!(calculator.timeline().len(), 4);
}