subtr_actor/stats/analysis_graph/nodes/
kickoff.rs1use super::*;
2use crate::stats::calculators::*;
3use crate::*;
4
5pub struct KickoffNode {
6 calculator: KickoffCalculator,
7}
8
9impl KickoffNode {
10 pub fn new() -> Self {
11 Self {
12 calculator: KickoffCalculator::new(),
13 }
14 }
15}
16
17impl Default for KickoffNode {
18 fn default() -> Self {
19 Self::new()
20 }
21}
22
23impl AnalysisNode for KickoffNode {
24 type State = KickoffCalculator;
25
26 fn name(&self) -> &'static str {
27 "kickoff"
28 }
29
30 fn dependencies(&self) -> NodeDependencies {
31 vec![
32 frame_info_dependency(),
33 gameplay_state_dependency(),
34 ball_frame_state_dependency(),
35 player_frame_state_dependency(),
36 touch_state_dependency(),
37 frame_events_state_dependency(),
38 speed_flip_dependency(),
39 boost_dependency(),
40 ]
41 }
42
43 fn evaluate(&mut self, ctx: &AnalysisStateContext<'_>) -> SubtrActorResult<()> {
44 let speed_flip = ctx.get::<SpeedFlipCalculator>()?;
45 let boost = ctx.get::<BoostCalculator>()?;
46 self.calculator
47 .update_with_speed_flips(KickoffUpdateContext {
48 frame: ctx.get::<FrameInfo>()?,
49 gameplay: ctx.get::<GameplayState>()?,
50 ball: ctx.get::<BallFrameState>()?,
51 players: ctx.get::<PlayerFrameState>()?,
52 touch_state: ctx.get::<TouchState>()?,
53 events: ctx.get::<FrameEventsState>()?,
54 speed_flip_events: speed_flip.events(),
55 boost_pickups: boost.new_pickup_events(),
56 })
57 }
58
59 fn finish(&mut self, _ctx: &AnalysisStateContext<'_>) -> SubtrActorResult<()> {
60 self.calculator.finish();
61 Ok(())
62 }
63
64 fn state(&self) -> &Self::State {
65 &self.calculator
66 }
67}
68
69pub(crate) fn boxed_default() -> Box<dyn AnalysisNodeDyn> {
70 Box::new(KickoffNode::new())
71}