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