subtr-actor 1.0.0

Rocket League replay transformer
Documentation
use crate::stats::analysis_graph::*;
use crate::stats::calculators::*;
use crate::*;
use boxcars;

macro_rules! build_analysis_player_event_indicator {
    (
        $struct_name:ident,
        $dependency:ident,
        $calculator:ty,
        $events:ident,
        $player_matches:expr,
        $column_name:expr $(,)?
    ) => {
        build_analysis_player_feature_adder!(
            $struct_name,
            |_self_: &$struct_name<F>| vec![$dependency()],
            |_self_: &$struct_name<F>,
             context: &AnalysisFeatureContext<'_>,
             player_id: &PlayerId,
             _processor: &dyn ProcessorView,
             _frame: &boxcars::Frame,
             _frame_count: usize,
             _current_time: f32| {
                let player_matches = $player_matches;
                let has_event = context
                    .state::<$calculator>()?
                    .$events()
                    .iter()
                    .any(|event| player_matches(event, player_id));
                convert_all_floats!(f32::from(has_event))
            },
            $column_name,
        );
    };
}

build_analysis_player_event_indicator!(
    AnalysisPlayerTouches,
    touch_dependency,
    TouchCalculator,
    new_events,
    |event: &TouchClassificationEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis touch event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerCenters,
    center_dependency,
    CenterCalculator,
    new_events,
    |event: &CenterEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis center event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerDoubleTaps,
    double_tap_dependency,
    DoubleTapCalculator,
    new_events,
    |event: &DoubleTapEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis double tap event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerOneTimers,
    one_timer_dependency,
    OneTimerCalculator,
    new_events,
    |event: &OneTimerEvent, player_id: &PlayerId| {
        &event.player == player_id || &event.passer == player_id
    },
    "analysis one timer event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerWallAerials,
    wall_aerial_dependency,
    WallAerialCalculator,
    new_events,
    |event: &WallAerialEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis wall aerial event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerWallAerialShots,
    wall_aerial_shot_dependency,
    WallAerialShotCalculator,
    new_events,
    |event: &WallAerialShotEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis wall aerial shot event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerCeilingShots,
    ceiling_shot_dependency,
    CeilingShotCalculator,
    new_events,
    |event: &CeilingShotEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis ceiling shot event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerFlicks,
    flick_dependency,
    FlickCalculator,
    new_events,
    |event: &FlickEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis flick event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerMustyFlicks,
    musty_flick_dependency,
    MustyFlickCalculator,
    new_events,
    |event: &MustyFlickEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis musty flick event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerDodgeResets,
    dodge_reset_dependency,
    DodgeResetCalculator,
    new_events,
    |event: &DodgeResetEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis dodge reset event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerFlipResetDodges,
    dodge_reset_dependency,
    DodgeResetCalculator,
    new_confirmed_flip_reset_events,
    |event: &ConfirmedFlipResetEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis flip reset dodge event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerHalfFlips,
    half_flip_dependency,
    HalfFlipCalculator,
    new_events,
    |event: &HalfFlipEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis half flip event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerHalfVolleys,
    half_volley_dependency,
    HalfVolleyCalculator,
    new_events,
    |event: &HalfVolleyEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis half volley event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerWavedashes,
    wavedash_dependency,
    WavedashCalculator,
    new_events,
    |event: &WavedashEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis wavedash event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerWhiffs,
    whiff_dependency,
    WhiffCalculator,
    new_events,
    |event: &WhiffEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis whiff event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerSpeedFlips,
    speed_flip_dependency,
    SpeedFlipCalculator,
    new_events,
    |event: &SpeedFlipEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis speed flip event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerFlipImpulses,
    flip_impulse_dependency,
    FlipImpulseCalculator,
    new_events,
    |event: &DodgeEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis dodge event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerPowerslides,
    powerslide_dependency,
    PowerslideCalculator,
    new_events,
    |event: &PowerslideEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis powerslide event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerBallCarries,
    ball_carry_dependency,
    BallCarryCalculator,
    new_carry_events,
    |event: &BallCarryEvent, player_id: &PlayerId| &event.player_id == player_id,
    "analysis ball carry event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerBoostPickups,
    boost_dependency,
    BoostCalculator,
    new_pickup_events,
    |event: &BoostPickupEvent, player_id: &PlayerId| &event.player_id == player_id,
    "analysis boost pickup event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerBoostRespawns,
    boost_dependency,
    BoostCalculator,
    new_respawn_events,
    |event: &RespawnEvent, player_id: &PlayerId| &event.player_id == player_id,
    "analysis boost respawn event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerBumps,
    bump_dependency,
    BumpCalculator,
    new_events,
    |event: &BumpEvent, player_id: &PlayerId| {
        &event.initiator == player_id || &event.victim == player_id
    },
    "analysis bump event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerPasses,
    pass_dependency,
    PassCalculator,
    new_events,
    |event: &PassEvent, player_id: &PlayerId| {
        &event.passer == player_id || &event.receiver == player_id
    },
    "analysis pass event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerRotationEvents,
    rotation_dependency,
    RotationCalculator,
    new_role_events,
    |event: &RotationRoleEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis rotation event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerMovementEvents,
    movement_dependency,
    MovementCalculator,
    new_events,
    |event: &MovementEvent, player_id: &PlayerId| &event.player == player_id,
    "analysis movement event",
);

build_analysis_player_event_indicator!(
    AnalysisPlayerPositioningEvents,
    positioning_dependency,
    PositioningCalculator,
    new_event_players,
    |event: &PlayerId, player_id: &PlayerId| event == player_id,
    "analysis positioning event",
);

pub(crate) fn analysis_player_event_feature_adder_from_name<F>(
    name: &str,
) -> Option<NDArrayPlayerFeatureAdder<F>>
where
    F: TryFrom<f32> + Send + Sync + 'static,
    <F as TryFrom<f32>>::Error: std::fmt::Debug,
{
    let event_name = name.strip_prefix("PlayerEvent:")?;

    match event_name {
        "touch" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerTouches::<F>::arc_new(),
        )),
        "center" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerCenters::<F>::arc_new(),
        )),
        "double_tap" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerDoubleTaps::<F>::arc_new(),
        )),
        "one_timer" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerOneTimers::<F>::arc_new(),
        )),
        "wall_aerial" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerWallAerials::<F>::arc_new(),
        )),
        "wall_aerial_shot" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerWallAerialShots::<F>::arc_new(),
        )),
        "ceiling_shot" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerCeilingShots::<F>::arc_new(),
        )),
        "flick" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerFlicks::<F>::arc_new(),
        )),
        "musty_flick" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerMustyFlicks::<F>::arc_new(),
        )),
        "dodge_reset" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerDodgeResets::<F>::arc_new(),
        )),
        "flip_reset_dodge" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerFlipResetDodges::<F>::arc_new(),
        )),
        "half_flip" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerHalfFlips::<F>::arc_new(),
        )),
        "half_volley" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerHalfVolleys::<F>::arc_new(),
        )),
        "wavedash" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerWavedashes::<F>::arc_new(),
        )),
        "whiff" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerWhiffs::<F>::arc_new(),
        )),
        "speed_flip" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerSpeedFlips::<F>::arc_new(),
        )),
        "dodge" | "flip_impulse" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerFlipImpulses::<F>::arc_new(),
        )),
        "powerslide" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerPowerslides::<F>::arc_new(),
        )),
        "ball_carry" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerBallCarries::<F>::arc_new(),
        )),
        "boost_pickup" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerBoostPickups::<F>::arc_new(),
        )),
        "boost_respawn" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerBoostRespawns::<F>::arc_new(),
        )),
        "bump" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerBumps::<F>::arc_new(),
        )),
        "pass" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerPasses::<F>::arc_new(),
        )),
        "rotation" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerRotationEvents::<F>::arc_new(),
        )),
        "movement" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerMovementEvents::<F>::arc_new(),
        )),
        "positioning" => Some(NDArrayPlayerFeatureAdder::analysis(
            AnalysisPlayerPositioningEvents::<F>::arc_new(),
        )),
        _ => None,
    }
}